您的位置:首页 > 移动开发 > Unity3D

单例模式 unity

2014-02-14 11:20 344 查看
在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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: