如何使Unity Singleton通用?

时间:2017-09-06 17:12:23

标签: c# unity3d

我目前正在审核Unity代码。

我正在研究如何使Singleton变得通用。

我正慢慢地从辛格尔顿学习。

在审核代码时我有很多问题。

就是这样:public class GameSingleton<T> : MonoBehaviour where T : MonoBehaviour

  1. 将MonoBehaviour指定为类型参数T?
  2. 的约束是什么意思

    1. 为什么在创建经理时通常会使用Singleton?
      1. 创建经理时,public class GameManager : GameSingleton<GameManager>{}
      2. 我使用这些代码,这是什么意思?

        1. 实施这些逻辑时,逻辑如何流动?
        2. 这就是全部..

          我需要学习什么来理解这些事情?

          作为初学者,我不太了解。我需要你的帮助。

2 个答案:

答案 0 :(得分:1)

1。where T : MonoBehaviour,表示此类使用的任何泛型必须继承MonoBehaviour,否则会出现编译时错误


2.经理(根据我的经验)通常是单身人士,因为资源旋转时间很长。例如,如果您的管理员正在管理与redis服务器的连接,并且正在使用stackexchanges redis nuget包。他们明确声明你应该只打开其中一个连接,因为它是线程安全的并且具有相对广泛的创建方法。


3. public class Gamemanager : GameSingleton<GameManager>.{}这意味着您有一个GameManager类,其继承GameSingleton并使用GameManager作为您的通用。


4.要了解遗产和泛型,我会研究mcirosofts c# tutorial


5.为了理解团结,我会研究unity

答案 1 :(得分:0)

1)这意味着您要创建的单身人士的T类型必须从MonoBehaviour继承,否则您将收到编译错误。

2)因为通常你不希望特定的经理在场景中出现多次(即实例数)。例如,考虑一个处理所有ScriptManagerFixedUpdateUpdate回调的LateUpdate,而不是让Unity处理它们:你不想要多个这样的经理出现在现场。 Singleton模式满足此条件(场景中不超过ScriptManager的一个实例)。

3)这意味着您告诉编译器类型TGameManager。如果您查看班级GameSingleton<T>的代码,您会看到其中包含private static T _instancepublic static T Instance属性等,并且GameSingleton属性_instance 1}}类知道InstanceGameManager必须是T类型。此外,您可以通过更改类型var func1 = new Promise(function(resolve,reject){ // get's executed without reason // do something if(var1 && var2){ resolve(true); } }); var func2 = new Promise(function(resolve,reject){ // get's executed without reason // do more if(var3 && var4){ resolve(true); } }); streamToPromise(stream).then(function (operation) { // do more // doesn't get executed if(varX && varY){ func1() .then(func2) .then(func3) .then(funcFinal) .catch(function (error) { // console log error } } } (即:GameManager,ScriptManager,CubesManager等)来创建不同的管理器。

4)你需要学习C#generics。