单例模式
来源:互联网 发布:google python style 编辑:程序博客网 时间:2024/05/17 04:15
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
然后你就可以用以下方士简单而粗制滥造的访问它:
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
- public class MyClass
- {
- private static MyClass instance;
- public static MyClass GetInstance()
- {
- if (!instance)
- {
- instance = GameObject.FindObjectOfType(typeof(MyClass));
- if (!instance)
- Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene.");
- }
- return instance;
- }
- }
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
- public class Logger : MonoBehaviour
- {
- private static Logger instance;
- private static GameObject container;
- public static Logger GetInstance()
- {
- if( !instance )
- {
- container = new GameObject();
- container.name = "Logger";
- instance = container.AddComponent(typeof(Logger)) as Logger;
- }
- return instance;
- }
- }
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
- MyClass.instance.DoSomething();
- public class MyClass
- {
- public static MyClass instance;
- public void Awake()
- {
- MyClass.instance = this;
- }
- }
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
- public class MyClass
- {
- private static MyClass _instance;
- public static MyClass Instance
- {
- get
- {
- if (!_instance)
- {
- _instance = GameObject.FindObjectOfType(typeof(MyClass));
- if (!_instance)
- {
- GameObject container = new GameObject();
- container.name = "MyClassContainer";
- _instance = container.AddComponent(typeof(MyClass)) as MyClass;
- }
- }
- return _instance;
- }
- }
- }
然后你就可以用以下方士简单而粗制滥造的访问它:
- MyClass.Instance.DoSomething();
0 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- keil如何生成bin文件
- SPOJ 19148 INS14G
- C++继承之子类的构造函数
- 重载计算三种类型的绝对值
- 四大组件之 activity
- 单例模式
- 什么是VI?
- Linux使用<一>安装Linux
- SSM框架的介绍
- TLS协议分析 (六) handshake协议扩展
- shell相关命令
- 关于jvm的垃圾回收机制
- Arcgis:Prime Farmland-Net area calculation
- 从原理角度解析Android (Java) http 文件上传