`

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();
分享到:
评论

相关推荐

    Unity3D通用单例基类

    在Unity3D游戏开发中,单例模式是一种常见的设计模式,用于确保在应用程序的整个生命周期内,某个类只有一个实例存在。这种模式对于管理共享资源、全局状态或在整个应用中需要频繁访问的对象非常有用。"Unity3D通用...

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

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

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

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

    场景管理单例模式1

    单例模式(Singleton Pattern)是一种常用的设计模式,在 Unity3D 中也可以使用这种模式来管理场景。在这个示例中,我们将实现一个场景管理单例模式,用于管理游戏中的场景。 单例模式的定义 单例模式是一种创建型...

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

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

    Unity3D的五子棋源码

    Unity3D的单例模式常用于状态管理,确保游戏状态在整个游戏过程中的一致性。 5. **用户交互**:Unity3D提供了丰富的UI组件和事件系统,用于处理用户的输入。例如,当用户点击棋盘时,会触发一个事件,然后由对应的...

    Unity3D飞机操纵游戏源码(完整版)

    可能涉及到单例模式的设计,确保全局变量在整个游戏流程中的正确性。 最后,UI界面也是游戏的重要组成部分。Unity的UI系统包括Canvas、Panel、Text、Button等组件,源码中可能会展示如何创建和更新游戏得分、菜单...

    iOS开发常用设计模式上海UNITY3D游戏外包共2页.p

    1. **单例模式**:在iOS和Unity3D中,单例模式常用于管理共享资源,如网络连接、配置设置或者游戏状态。它确保一个类只有一个实例,并提供一个全局访问点。 2. **工厂模式**:在创建对象时,工厂模式可以隐藏对象...

    基于Unity3d的FPS与塔防相结合的游戏设计.doc

    设计模式则是解决游戏设计中常见问题的成熟方案,如单例模式在管理全局资源,工厂模式在生成游戏对象等方面都有广泛应用。 在系统分析部分,进行了可行性分析和需求分析。可行性分析确认了使用Unity3d进行此类游戏...

    Unity3d MVC 例子

    在实际应用中,Unity3D的MVC模式可能需要结合其他设计模式,如单例模式(用于管理全局状态)或工厂模式(用于创建对象)。此外,Unity3D的EventSystem和UnityEvent可以作为实现控制器功能的有效工具,它们简化了游戏...

    介绍通用的设计模式。(基于Unity3D【C#】).zip

    本资料包主要聚焦于将设计模式应用于Unity3D游戏开发环境,其中主要使用的编程语言是C#。在Unity3D中,理解并运用设计模式能够帮助开发者创建更加灵活、可维护且易于扩展的游戏代码。 一、单例模式(Singleton) ...

    Unity3D游戏高性能战争迷雾系统.zip

    开发者可能会编写一些静态类或者单例模式来管理迷雾系统,确保在整个游戏过程中只有一个实例存在,以保持数据的一致性。 对于“迷雾系统”,在Unity3D中,可以使用颜色贴图(Color Texture)或深度贴图(Depth ...

    [多媒体/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中的...

    unity新手抛物线大炮单例.zip

    本教程"unity新手抛物线大炮单例.zip"专为初学者设计,旨在教授如何利用Unity创建一个简单的抛物线大炮游戏,并且融入了单例模式的设计思想。 首先,我们来详细探讨Unity中的抛物线投射。在物理模拟中,大炮发射...

    unity3d场景管理插件

    Unity3D是一款强大的跨平台游戏开发引擎,广泛应用于2D和3D游戏、虚拟现实(VR)、增强现实(AR)以及互动式内容的制作。在Unity中,场景管理是项目开发过程中的重要组成部分,它涉及到游戏流程的组织、资源加载和切换等...

    unity3d中脚本调用

    3. **单例模式**:对于需要全局访问的服务类(如数据管理、音频管理等),可以考虑使用单例模式来实现,这样可以简化脚本间的调用过程。 通过以上介绍,我们可以看到,在Unity3D中实现脚本间的有效调用并不复杂,但...

    Unity3D 连连看游戏

    开发者可能使用单例模式来管理全局的游戏状态。 12. **性能优化**:对于移动设备,性能优化尤为重要。开发者可能采用延迟加载、对象池技术来减少内存占用和提高运行效率。 通过分析“lianLianKan”这个压缩包,...

    Unity3D岗位面试过程中的一些知识点总结.docx

    在Unity3D的岗位面试中,面试官可能会考察求职者对于游戏开发的深入理解,包括设计模式的应用、UI系统的设计、性能优化策略以及对Unity引擎特性的掌握等。以下是一些关键知识点的详细说明: 1. **设计模式**:面试...

    Unity3D中空引用错误的报错解答1

    4. **静态成员和单例模式**:有时候,我们可以通过将DaiMa2设计为静态类或使用单例模式来确保全局唯一实例,这样可以避免因为实例化问题导致的空引用异常。 5. **错误检查**:在调用其他对象的方法之前,应先检查...

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

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

Global site tag (gtag.js) - Google Analytics