Unity3D单例类模板类的实现
By D.S.Qiu
尊重他人的劳动,支持原创,转载请注明出处:http.dsqiu.iteye.com
无意中Unity工程中看到Singleton的类,因为之前D.S.Qiu在项目中也用了Singleton来做所有View的单例类模板,有种“英雄所见略同”的赶脚(虽然此处用法不当),所以贴出来分享下:
using UnityEngine; /// <summary> /// Be aware this will not prevent a non singleton constructor /// such as `T myT = new T();` /// To prevent that, add `protected T () {}` to your singleton class. /// /// As a note, this is made as MonoBehaviour because we need Coroutines. /// </summary> public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private static T _instance; private static object _lock = new object(); public static T Instance { get { if (applicationIsQuitting) { Debug.LogWarning("[Singleton] Instance '"+ typeof(T) + "' already destroyed on application quit." + " Won't create again - returning null."); return null; } lock(_lock) { if (_instance == null) { _instance = (T) FindObjectOfType(typeof(T)); if ( FindObjectsOfType(typeof(T)).Length > 1 ) { Debug.LogError("[Singleton] Something went really wrong " + " - there should never be more than 1 singleton!" + " Reopenning the scene might fix it."); return _instance; } if (_instance == null) { GameObject singleton = new GameObject(); _instance = singleton.AddComponent<T>(); singleton.name = "(singleton) "+ typeof(T).ToString(); DontDestroyOnLoad(singleton); Debug.Log("[Singleton] An instance of " + typeof(T) + " is needed in the scene, so '" + singleton + "' was created with DontDestroyOnLoad."); } else { Debug.Log("[Singleton] Using instance already created: " + _instance.gameObject.name); } } return _instance; } } } private static bool applicationIsQuitting = false; /// <summary> /// When Unity quits, it destroys objects in a random order. /// In principle, a Singleton is only destroyed when application quits. /// If any script calls Instance after it have been destroyed, /// it will create a buggy ghost object that will stay on the Editor scene /// even after stopping playing the Application. Really bad! /// So, this was made to be sure we're not creating that buggy ghost object. /// </summary> public void OnDestroy () { applicationIsQuitting = true; } }
小结:
别人实现的就是考虑到位,同步锁和程序退出的情况,D.S.Qiu实现的版本都没有做这样的考虑。不过,D.S,Qiu的View其实是用来管理UI的但没有继承MonoBehavior,只是一个普通的C#类,便于自己管理,不过这样有一个劣势就是不能使用MonoBehavior的行为,如协程等特性。
如果您对D.S.Qiu有任何建议或意见可以在文章后面评论,或者发邮件(gd.s.qiu@gmail.com)交流,您的鼓励和支持是我前进的动力,希望能有更多更好的分享。
转载请在文首注明出处:http://dsqiu.iteye.com/blog/2017655
更多精彩请关注D.S.Qiu的博客和微博(ID:静水逐风)
相关推荐
1. **单例模式**:在iOS和Unity3D中,单例模式常用于管理共享资源,如网络连接、配置设置或者游戏状态。它确保一个类只有一个实例,并提供一个全局访问点。 2. **工厂模式**:在创建对象时,工厂模式可以隐藏对象...
在这个项目中,我们将探讨Unity3D与设计模式的结合,以及在游戏开发中如何实现高效、可维护的代码。 1. **Unity3D基础**: Unity3D是一款跨平台的游戏开发工具,支持2D和3D场景创建。它的脚本语言主要是C#,这使得...
在Unity3D游戏开发中,设计模式是一种标准的解决方案,用于解决常见的编程问题,提高代码的可维护性、可扩展性和可复用性。本文将深入探讨.NET开发中,特别是Unity环境下的各种设计模式及其实践应用。 1. 单例模式...
Unity引擎作为全球广泛使用的3D游戏开发平台,其强大的功能和灵活性深受开发者喜爱。然而,随着项目复杂性的增加,如何组织代码、提高代码可读性和可维护性就显得至关重要。这就是设计模式在游戏开发中的作用。...
在游戏开发领域,Unity3D(简称U3D)引擎因其强大的功能和易用性而备受青睐。然而,随着项目规模的扩大,代码的维护和扩展成为开发者面临的挑战。此时,引入设计模式就显得尤为重要。"Unity-Design-Pattern"这个项目...
总体来说设计模式分为三大类: 创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...
Unity是一款强大的跨平台游戏开发引擎,被广泛应用于2D、3D游戏以及虚拟现实(VR)和增强现实(AR)项目。"Unity-简易基础框架"通常指的是在Unity上建立的用于快速启动新项目的框架,它包含了一系列预先设计好的组件、...
**区别**:类是模板或蓝图,用于定义对象的结构和行为;而对象则是根据这个模板创建的具体实体。 #### 3. 重载、继承、重写、多态的理解 - **重载(Overloading)**:在同一作用域内定义多个同名但参数列表不同的方法...
在Unity3d-EventsManager-master这个压缩包中,我们通常会发现以下几个关键部分: 1. **事件类(Event Classes)**:这些是自定义的C#类,它们定义了事件的数据结构。例如,你可以有一个ScoreChangeEvent,用于在...
游戏程序开发面试题通常涵盖了多个领域,包括但不限于Unity3D引擎、C#编程语言和C++编程语言。这些技术在游戏开发中起着至关重要的作用。以下是对这些知识点的详细阐述: 1. **Unity3D引擎**:Unity是业界广泛使用...
3. **C#编程**:Unity的主要脚本语言是C#,掌握类、对象、接口、泛型、委托等C#核心概念,以及异步编程、错误处理和性能优化等高级特性,对于编写高质量的Unity脚本至关重要。 4. **Lua脚本**:在某些情况下,...
6. **Unity引擎**:对于游戏开发岗位,了解C#在Unity3D中的应用,理解游戏逻辑和引擎交互。 通过学习这些面试题集,你可以系统地复习和巩固这些语言的关键知识点,提升自己的技术水平,为面试做好充分准备。同时,...
这些通常通过管理类或者单例模式实现,确保在整个游戏流程中的数据一致性。 7. **用户界面(UI)**:Unity的UI系统提供了丰富的控件和布局选项,如文本、按钮、滑块等,用于创建游戏菜单、计分板和提示信息。项目中...
2. **单例模式(Singleton Pattern)**:Unity中的许多全局管理类,如GameManager或SceneManager,常使用单例模式确保在整个游戏生命周期内只有一个实例存在。 3. **脚本组件(Scriptable Objects)**:Unity的脚本...
C#是一种面向对象的编程语言,由微软开发,广泛应用于Windows应用开发、游戏开发(如Unity3D)、Web应用等领域。ASP.NET是微软推出的一种用于构建动态Web应用程序的框架,它支持多种编程语言,包括C#。 #### C#与...
3. **Unity3D原型**:在游戏开发领域,Unity3D以其强大的3D渲染和物理引擎著称。通过预制件(Prefabs)、脚本组件和编辑器工具,开发者能快速制作出互动性高的游戏原型,验证游戏机制和玩法。 4. **C#编程基础**:...
类是对象的模板,包含属性(数据成员)和方法(行为)。 3. **继承、封装与多态**:这是OOP的三大特性。继承允许子类从父类中继承属性和方法;封装是将数据和操作数据的方法捆绑在一起;多态则允许不同类的对象对...
1. **C++基础**:考察对C++语法的掌握程度,包括类与对象、继承、多态、模板、异常处理等。理解并能熟练运用这些概念是C++程序员的基本功。 2. **数据结构与算法**:笔试中可能包含排序算法(如快速排序、归并排序...
Unity支持3D和2D游戏开发,提供一套完整的物理系统、图形渲染以及资源管理工具。 5. **ASP.NET**: 如果这是一个Web应用,那么它可能使用了ASP.NET,这是.NET框架的一部分,用于构建动态网站和Web服务。ASP.NET提供...