Unity3d 单例模式的实现
2012-12-07 15:49
197 查看
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
01 public class MyClass
02 {
03 private static MyClass instance;
04 public static MyClass GetInstance()
05 {
06 if (!instance)
07 {
08 instance = GameObject.FindObjectOfType(typeof(MyClass));
09 if (!instance)
10 Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");
11 }
12
13 return instance;
14 }
15 }
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
01 public class Logger : MonoBehaviour
02 {
03 private static Logger instance;
04 private static GameObject container;
05 public static Logger GetInstance()
06 {
07 if( !instance )
08 {
09 container = new GameObject();
10 container.name = "Logger";
11 instance = container.AddComponent(typeof(Logger)) as Logger;
12 }
13 return instance;
14 }
15 }
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
MyClass.instance.DoSomething();
1 public class MyClass
2 {
3 public static MyClass instance;
4 public void Awake()
5 {
6 MyClass.instance = this;
7 }
8 }
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
祝你愉快!
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
01 public class MyClass
02 {
03 private static MyClass _instance;
04 public static MyClass Instance
05 {
06 get
07 {
08 if (!_instance)
09 {
10 _instance = GameObject.FindObjectOfType(typeof(MyClass));
11 if (!_instance)
12 {
13 GameObject container = new GameObject();
14 container.name = "MyClassContainer";
15 _instance = container.AddComponent(typeof(MyClass)) as MyClass;
16 }
17 }
18
19 return _instance;
20 }
21 }
22 }
然后你就可以用以下方士简单而粗制滥造的访问它:
MyClass.Instance.DoSomething();
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
01 public class MyClass
02 {
03 private static MyClass instance;
04 public static MyClass GetInstance()
05 {
06 if (!instance)
07 {
08 instance = GameObject.FindObjectOfType(typeof(MyClass));
09 if (!instance)
10 Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");
11 }
12
13 return instance;
14 }
15 }
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
01 public class Logger : MonoBehaviour
02 {
03 private static Logger instance;
04 private static GameObject container;
05 public static Logger GetInstance()
06 {
07 if( !instance )
08 {
09 container = new GameObject();
10 container.name = "Logger";
11 instance = container.AddComponent(typeof(Logger)) as Logger;
12 }
13 return instance;
14 }
15 }
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
MyClass.instance.DoSomething();
1 public class MyClass
2 {
3 public static MyClass instance;
4 public void Awake()
5 {
6 MyClass.instance = this;
7 }
8 }
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
祝你愉快!
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
01 public class MyClass
02 {
03 private static MyClass _instance;
04 public static MyClass Instance
05 {
06 get
07 {
08 if (!_instance)
09 {
10 _instance = GameObject.FindObjectOfType(typeof(MyClass));
11 if (!_instance)
12 {
13 GameObject container = new GameObject();
14 container.name = "MyClassContainer";
15 _instance = container.AddComponent(typeof(MyClass)) as MyClass;
16 }
17 }
18
19 return _instance;
20 }
21 }
22 }
然后你就可以用以下方士简单而粗制滥造的访问它:
MyClass.Instance.DoSomething();
相关文章推荐
- 游戏开发设计模式之命令模式(unity3d 示例实现)
- Unity3D中实现简单的电影模式框架
- Unity3D中多种单例模式的实现方式
- 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)
- Unity3D学习之如何利用C#实现代理模式
- 游戏开发设计模式之原型模式 & unity3d JSON的使用(unity3d 示例实现)
- Unity3d C# 脚本单体模式的实现
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- 在Unity3d中实现观察者模式
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- 游戏开发设计模式之子类沙盒模式(unity3d 示例实现)
- 游戏开发设计模式之原型模式 & unity3d JSON的使用(unity3d 示例实现)
- 在Unity3D中基于订阅者模式怎样实现事件机制
- Unity3D中实现简单的电影模式框架
- 在Unity3D中基于订阅者模式实现事件机制
- 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)
- Unity3D的单例模式实现
- 游戏开发设计模式之对象池模式(unity3d 示例实现)
- Unity3D 利用C#实现简单的代理模式Delegate(委托)
- Unity3D的单例模式实现