Unity3D 单例实现方法(方便简单)
2015-11-01 16:18
513 查看
在Unity3D 中单例是一个设计模式,可以方便在一个工程中,对单一的游戏对象的脚本组件的控制与调用.
相比大多数的人都会使用伪单例来解决.虽然,伪单例使用起来非常的简单方便,但只适用于一些小的工程项目中,而且使用时,会产生多次声明的错误使用,使用起来并不是非常的好用.
今天我给大家带来一个简单方便的实现单例的方法,仅仅只需要一个脚本,和几行代码就可以很好的实现单例模式的使用,而且可以避免很多的错误产生.希望大家可以喜欢,相互支持和帮助.下面是脚本部分.
添加单例模板类(全局公用的定义单例的脚本组件,供继承使用)
using UnityEngine; /// <summary> /// 功能:添加单例模板类,在想要创建单例的脚本中后面继承Singleton<T>并添加下面的两行代码,就可以实现单例功能 例子(继承): public class GameManager : Singleton<GameManager> /// private void Init(){} /// void Awake(){ this.Init();} /// 创建时间: 2015年11月1日 15:03 /// </summary> public class Singleton<T> : MonoBehaviour where T : MonoBehaviour {//脚本单例后接泛型<T> 继承 MonoBehaviour, 约束泛型<T>(也就是你要定义单例的脚本) : 继承MonoBehaviour where后面接约束条件 //这里的泛型<T> 就是代表要定义的单例脚本 private static T _instance;//定义静态的泛型<T>的类型的变量 _instance private static object _lock = new object();//定义一个静态的objec类型的_lock并实例化 private static bool applicationIsQuitting = false;//定义bool类型的变量applicationIsQuitting 判断程序是否关闭 public static T Instance//定义静态的泛型<T>类型的属性 { get//get方法 { if(applicationIsQuitting)//如果applicationIsQuitting为真 则返回null 以下的代码不执行 { return null; } lock(_lock)//lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。 { if(null == _instance)//如果_instance等于空 执行一下代码 { _instance = (T)FindObjectOfType (typeof(T));//_instance找到类型为泛型<T>(也就是想要定义为单例的脚本) if (FindObjectsOfType (typeof(T)).Length > 1) //如果_instance找到的长度大于 { return _instance;//返回_instance 保证单例的唯一性 } if(null == _instance) //如果_instance等于空 { GameObject singleton = new GameObject ();//实例化出一个GameObject类型的singleton(单例) _instance = singleton.AddComponent<T>();//把GameObject类型的对象singleton添加上泛型<T>(想要定义为单例的脚本)组件(脚本) singleton.name = "(singleton)" + typeof(T).ToString ();//名字为...... DontDestroyOnLoad (singleton);//切换场景后保留singleton 保持单例在场景中的传递,用于存储一些小型的数据 } } return _instance;//返回出_instance单例 } } } public void OnDestroy()//定义一个无参无返回值的方法OnDestroy 用于清除定义的单例 { applicationIsQuitting = true;//设置applicationIsQuitting 为真 } }
单例脚本的实现例子
using UnityEngine; using System.Collections; /// <summary> /// 功能:单例实现的例子 /// 创建时间:2015年11月1日 15:56 /// </summary> public class GameManager : Singleton<GameManager> {//脚本GameManager : 继承Singleton<GameManager> "(Singleton<T>)" 泛型的脚本书写方法 public float score;//定义float类型的score(分数) 由于单例的测试 // Use this for initialization private void Init()//私有的方法 用于使用单例 { //Init code } void Awake () { this.Init();//引用单例 } }
引用单例脚本中的变量,属性,方法的语句
GameManager.Instance.score = 99;//给GameManager的score变量 初始化等于99 print (GameManager.Instance.score);//输出GameManager的score变量
大家可以测试一下了,单例是否可以使用了,如果大家有更好的方法可以在评论中互相交流学习,谢谢大家的支持和鼓励!
相关文章推荐
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- Kinect结合Unity3D引擎开发体感游戏(一)
- 肯特·贝克:改变人生的代码整理魔法
- 网页恶意代码的预防
- 高手写的Tracer-Flash代码调试类代码下载
- CSS代码缩写技巧
- 非主流Q-zOne代码代码搜集第1/2页
- CreateWeb.vbs 代码
- Lua和C语言的交互详解
- Lua中编译执行代码相关的函数详解
- 更有效率的css代码编写第1/3页
- 代码中到底应不应当写注释?
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解