Unity单件模式

Unity Singleton Pattern(Unity单件模式)
本文介绍了Unity单件模式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这只是一个困扰我关于Unity的问题。

我们经常使用游戏管理器等Singleton对象,为此有两种方法。

一种是使用Singleton.cs c Sharp类,如下所示:

using System;
using System.Linq;
using UnityEngine;

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
    static T instance;

    DateTime BirthTime;

    public static T Instance
    {
        get
        {
            if (instance == null)
                Initialize();

            return instance;
        }
    }

    private void Awake()
    {
        BirthTime = DateTime.Now;
    }

    public static void Initialize()
    {
        if (instance == null)
            instance = FindObjectOfType<T>();
    }
}

然后将GameManager派生为

GamaManager : Singleton<GameManager>

在大众看来,这种方法很消耗CPU,尤其是在移动设备上,因为Unity要使用Singleton中提到的Initialize方法,必须遍历这么多对象的层次结构。

更简单的方法是创建私有实例,并在启动或唤醒时将其初始化为:

GameManager : MonoBehaviour
{
    public static GameManager Instance { get; private set; }

    void Start()
    {
        Instance = this;
    }
}

但我认为,这就像是一次又一次地编写相同的代码。有没有人能建议一种更干净的方法来解决这个问题?

推荐答案

我不确定您到底想要什么,但在单例模式中,我更喜欢创建一个像GameManager这样的主类,并使用下面这段代码将其设置为单例类:

static GameManager _instance;
    public static GameManager instance {
        get {
            if (!_instance) {
                _instance = FindObjectOfType<GameManager>();
            }
            return _instance;
        }
    }

或您编写的代码,之后根据其他子管理器类型定义变量,并由GameManager单例访问。

例如:

public BulletManager myBulletManager;

按如下方式使用:

GameManager.instance.myBulletManager.Fire();

这篇关于Unity单件模式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)