您的位置:首页 > 移动开发 > Unity3D

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变量

大家可以测试一下了,单例是否可以使用了,如果大家有更好的方法可以在评论中互相交流学习,谢谢大家的支持和鼓励!


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  unity3d c语言 代码