`

Unity3D 里的单例模式(转)

 
阅读更多
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
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();
分享到:
评论

相关推荐

    UnitySingleton:在Unity中实现单例模式的最佳方法

    在Unity中实现单例模式的最佳方法。 通过使用这种模式,您将能够定义Global变量和类,并在Global中使用它们的方法和属性。 对于使用Unity引擎制作的大多数游戏来说,这种模式都是必须的。 :open_book: 产品特点 ...

    yaSingleton:Unity3d的单例模式实现。 基于ScriptableObjects而非常规的MonoBehaviour方法

    示例Unity项目可在找到。 为什么 为什么要使用yaSingleton,为什么要使用ScriptableObjects? 在不同场景中没有单例的重复实例。 保证可以在任何Awake脚本之前运行的单入口点。 轻松的版本控制。 由于单例另存为...

    unity 单例父类 基本上涵盖了各种可能的单例

    里边一共包含了三个基本的单例类型,分别为 1非游戏对象单例 2随场景切换而销毁的单例 3不随场景切换而销毁的单例 其中2 3 中有一段可以自动创建单例对象的代码已注释 使用方法 继承对应的父类并在泛型中指明自己 ...

    [多媒体/3D 动画/游戏] Unity3D游戏编程基础入门班 by 泰课在线(价值200元)[高清完整版][AVI+TS][1.43GB]

    课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity中的五种视图 课时7 Unity中的...

    Unity3D 项目的简单GameManager 类_C#_代码_下载

    Unity3D 项目的简单 GameManager 类。 SimpleGameManager 类使用单例模式实现,并在类实例上使用 DontDestroyOnLoad 函数。它是一个基于枚举状态的类,可用于操作项目中的所有游戏状态。 更多详情、使用方法,请...

    unity-23种常见设计模式unity版

    创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式:共十一种:...

    U3D Udp的发送、接受和处理

    Send.cs类使用单例模式发送,获取UPD消息.cs类负责消息接受,UDP消息处理.cs类负责消息的处理,因为我经常使用UDP功能,所以我整合了一下,非常方便使用,只要把“获取UPD消息.cs”和“UDP消息处理.cs”拖到一个对象...

    singleton.lua

    由于unity3d现在热更的主要方式还是以lua为主,lua就成了手游开发必不可少的技能之一,而单例模式不可避免的要被使用,例如:数据管理器,游戏管理器,UI管理器等,那么有个好的单例基类就可以节约好多代码,让你...

    Unity-3D-Asteroids:一个简单的Asteroids克隆。 在3D中

    软件模式:OOP,合成,单例,对象池,观察者,... 组合与OOP:接口+继承与通过组件的对象组合 MonoBehaviour +扩展 序列化 习语:一对多 事件:C#委托事件与UnityEvents 协程 最佳化 工作流程选择 总体过程: 您...

    MMOARPG地下守护神_单机版实战视频课程(下部)

     开发讲解以上内容涉及到: 代理模式、单例模式、访问者模式、责任链模式(新手引导应用)等在实战项目中的具体灵活应用,以及大量商业项目底层核心技术例如: 企业日志系统(高级bug调试排错系统)、新手引导、背包...

    projects-ReedMe:我为您提供了一个查看我的存储库的方向。 我写了从项目中可以得到的信息,功能

    关于我的存储库-ReedMe的全部 ...其他框架-单例模式,对象池,加载场景,UI,声音 安装? :locked: Unity TowerDefense游戏 语言:C# 工具:Unty 项目类型:个人项目,负责所有 该项目正在进行中。 最近,我实

Global site tag (gtag.js) - Google Analytics