查看: 2080|回复: 9
打印 上一主题 下一主题

[其他] Unity3d中单例模式的使用

[复制链接]

2722

主题

42

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
38268
精华
111

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-11-24 01:45:25 |只看该作者 |倒序浏览

单例模式(singleton pattern)大家都不陌生,我今天主要是和大家探讨一下单例模式在unity中的实现,比起一般的单例,unity中有些他的特点。

最普通的单例:(样式一)
public class Singleton
{
    static Singleton instance;

    public static Singleton Instance {
        get {
            if (instance == null) {
                instance = new Singleton ();
            }
            return instance;
        }
    }
}
unity单例模式二:
但是unity的所有脚本都必须挂在一个gameobject上,否则无法执行,你这个单例中若只是一些数据,那倒没关系,但我相信绝大多数单例模式都不 会只包含数据,若只要实现包含数据的功能,用全局静态变量就行了,说到这里加一句,有些盆友喜欢用单例脚本当做全局脚本来用,那其实是违背单例模式的初衷 的...
好,我们来实现以下挂到gameobject的单例(模式二):
using UnityEngine;
public class UnitySingleton : MonoBehaviour {
    static UnitySingleton instance;
    public static UnitySingleton Instance {
        get {
            if ( instance == null ) {
                GameObject obj = new GameObject("UnitySingleton");
                instance = obj.AddComponent(typeof(UnitySingleton)) as UnitySingleton;            
            }
            return instance;
        }
    }
}
unity单例模式三:
那如果我的游戏里有很多单例脚本,每个脚本都这么写岂不是很麻烦?岂不是很违背oo思想?^_^,那我们来设计一个泛型类:
using UnityEngine;
public class UnitySingletonG : MonoBehaviour where T : Component {
    private static T _instance;
    public static T Instance {
        get {
            if ( _instance == null ) {
                GameObject obj = new GameObject("UnitySingletonG");
                // 隐藏实例化的new game object,下同
                //obj.hideFlags = HideFlags.HideAndDontSave;   
                // 不删除该物体
                DontDestroyOnLoad(obj);
                _instance = obj.AddComponent(typeof(T)) as T;
            }
            return _instance;
        }
    }
}
这样一来,场景中需要单例化的脚本只要简单的继承这个类就可以了

参考链接:
http://www.unitymanual.com/thread-16916-1-1.html
http://www.unitymanual.com/forum.php?mod=viewthread&tid=21956&highlight=单例
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-11-24 02:27:28 |只看该作者
Verey interesting
回复

使用道具 举报

33

主题

1

听众

2680

积分

中级设计师

Rank: 5Rank: 5

纳金币
559
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-11-24 09:17:13 |只看该作者
thanks 啊
回复

使用道具 举报

3

主题

1

听众

6189

积分

高级设计师

Rank: 6Rank: 6

纳金币
370
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2014-11-24 11:43:48 |只看该作者
很好的思路和代码
回复

使用道具 举报

4

主题

2

听众

1742

积分

助理设计师

Rank: 4

纳金币
110
精华
0

活跃会员

5#
发表于 2014-11-24 13:20:35 |只看该作者

thanks 啊
回复

使用道具 举报

0

主题

2

听众

1346

积分

助理设计师

Rank: 4

纳金币
505
精华
0
6#
发表于 2014-11-24 13:43:10 |只看该作者
长知识了 ! 谢谢指导 !
回复

使用道具 举报

100

主题

3

听众

7683

积分

高级设计师

Rank: 6Rank: 6

纳金币
2378
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2014-11-24 20:21:22 |只看该作者
Verey interesting !
回复

使用道具 举报

16

主题

1

听众

1万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
3
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

8#
发表于 2014-11-25 20:45:01 |只看该作者
不错,简单好用, 多谢!
回复

使用道具 举报

7

主题

1

听众

715

积分

初级设计师

Rank: 3Rank: 3

纳金币
259
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2014-11-26 02:25:33 |只看该作者
非常感謝你分享這個
回复

使用道具 举报

may    

8830

主题

80

听众

7万

积分

首席设计师

Rank: 8Rank: 8

纳金币
52336
精华
343

最佳新人 热心会员 灌水之王 活跃会员 突出贡献 荣誉管理 论坛元老

10#
发表于 2014-11-26 07:20:15 |只看该作者
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-9-23 05:19 , Processed in 0.092323 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部