`

Unity3D单例类模板类的实现

 
阅读更多

                                                           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
0
分享到:
评论

相关推荐

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

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

    P级阵地项目(设计模式与游戏完美开发)源码

    在这个项目中,我们将探讨Unity3D与设计模式的结合,以及在游戏开发中如何实现高效、可维护的代码。 1. **Unity3D基础**: Unity3D是一款跨平台的游戏开发工具,支持2D和3D场景创建。它的脚本语言主要是C#,这使得...

    dotnet-Unity中各种设计模式的实践与运用

    在Unity3D游戏开发中,设计模式是一种标准的解决方案,用于解决常见的编程问题,提高代码的可维护性、可扩展性和可复用性。本文将深入探讨.NET开发中,特别是Unity环境下的各种设计模式及其实践应用。 1. 单例模式...

    Unity-DesignPatternSamples-master.zip

    Unity引擎作为全球广泛使用的3D游戏开发平台,其强大的功能和灵活性深受开发者喜爱。然而,随着项目复杂性的增加,如何组织代码、提高代码可读性和可维护性就显得至关重要。这就是设计模式在游戏开发中的作用。...

    Unity-Design-Pattern

    在游戏开发领域,Unity3D(简称U3D)引擎因其强大的功能和易用性而备受青睐。然而,随着项目规模的扩大,代码的维护和扩展成为开发者面临的挑战。此时,引入设计模式就显得尤为重要。"Unity-Design-Pattern"这个项目...

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

    总体来说设计模式分为三大类: 创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    Unity-简易基础框架

    Unity是一款强大的跨平台游戏开发引擎,被广泛应用于2D、3D游戏以及虚拟现实(VR)和增强现实(AR)项目。"Unity-简易基础框架"通常指的是在Unity上建立的用于快速启动新项目的框架,它包含了一系列预先设计好的组件、...

    龙腾简合unity工程师笔试题

    **区别**:类是模板或蓝图,用于定义对象的结构和行为;而对象则是根据这个模板创建的具体实体。 #### 3. 重载、继承、重写、多态的理解 - **重载(Overloading)**:在同一作用域内定义多个同名但参数列表不同的方法...

    EventsManager

    在Unity3d-EventsManager-master这个压缩包中,我们通常会发现以下几个关键部分: 1. **事件类(Event Classes)**:这些是自定义的C#类,它们定义了事件的数据结构。例如,你可以有一个ScoreChangeEvent,用于在...

    游戏程序开发面试题

    游戏程序开发面试题通常涵盖了多个领域,包括但不限于Unity3D引擎、C#编程语言和C++编程语言。这些技术在游戏开发中起着至关重要的作用。以下是对这些知识点的详细阐述: 1. **Unity3D引擎**:Unity是业界广泛使用...

    Unity面试笔试集锦,收录Unity面试题,数据结构和算法,C#,Lua等内容,长期维护.zip

    3. **C#编程**:Unity的主要脚本语言是C#,掌握类、对象、接口、泛型、委托等C#核心概念,以及异步编程、错误处理和性能优化等高级特性,对于编写高质量的Unity脚本至关重要。 4. **Lua脚本**:在某些情况下,...

    java .net面试题精选

    6. **Unity引擎**:对于游戏开发岗位,了解C#在Unity3D中的应用,理解游戏逻辑和引擎交互。 通过学习这些面试题集,你可以系统地复习和巩固这些语言的关键知识点,提升自己的技术水平,为面试做好充分准备。同时,...

    unity-2d-platformer-source:https-Game source platform

    这些通常通过管理类或者单例模式实现,确保在整个游戏流程中的数据一致性。 7. **用户界面(UI)**:Unity的UI系统提供了丰富的控件和布局选项,如文本、按钮、滑块等,用于创建游戏菜单、计分板和提示信息。项目中...

    unity-utils-wrapper

    2. **单例模式(Singleton Pattern)**:Unity中的许多全局管理类,如GameManager或SceneManager,常使用单例模式确保在整个游戏生命周期内只有一个实例存在。 3. **脚本组件(Scriptable Objects)**:Unity的脚本...

    最先进的原型

    3. **Unity3D原型**:在游戏开发领域,Unity3D以其强大的3D渲染和物理引擎著称。通过预制件(Prefabs)、脚本组件和编辑器工具,开发者能快速制作出互动性高的游戏原型,验证游戏机制和玩法。 4. **C#编程基础**:...

    KampIntro:恩金·德米罗格(Engin Demirog Camp)

    类是对象的模板,包含属性(数据成员)和方法(行为)。 3. **继承、封装与多态**:这是OOP的三大特性。继承允许子类从父类中继承属性和方法;封装是将数据和操作数据的方法捆绑在一起;多态则允许不同类的对象对...

    永航科技笔试题

    1. **C++基础**:考察对C++语法的掌握程度,包括类与对象、继承、多态、模板、异常处理等。理解并能熟练运用这些概念是C++程序员的基本功。 2. **数据结构与算法**:笔试中可能包含排序算法(如快速排序、归并排序...

    ReCapProjectFinal

    Unity支持3D和2D游戏开发,提供一套完整的物理系统、图形渲染以及资源管理工具。 5. **ASP.NET**: 如果这是一个Web应用,那么它可能使用了ASP.NET,这是.NET框架的一部分,用于构建动态网站和Web服务。ASP.NET提供...

Global site tag (gtag.js) - Google Analytics