轩辕kuku
论坛版主
论坛版主
  • UID14
  • 粉丝6
  • 关注1
  • 发帖数78
  • 社区居民
  • 原创写手
阅读:709回复:1

Unity开发基础之单例模式

楼主#
更多 发布于:2016-05-08 10:27
在最起初我们做unity3D开发都不会去考虑代码管理以及代码后期拓展的问题,都会把精力放在代码逻辑上面。当接触到稍微大一点的项目,你会发现逻辑越写越混乱,改的新bug的代码可能就成为了下一个bug,维护起来也相当混乱。随后你就要去看一些代码设计模式或者程序框架之类的东西。在Unity3D开发中最基础的应该就是单例模式,一般会把一些管理的类作为单例类,方便统一管理和调用。
比如一个资源管理的类ResourceManager,如果该类不继承脚本MonoBehaviour,其单例写法:
public class ResourceManager{
private static ResourceManager _instance =null;
public static ResourceManager instance
{
get{
if(_instance == null)
{
_instance = new ResourceManager();//此处为构造函数,你可以自己在这个类定义属于自己的构造函数
}
return _instance;
}
}
public string name = "单例";
}
调用方式 ResourceManager.instance.name既可以;
如果你需要在单例类中使用Unity3d脚本的生命周期函数,也就是继承MonoBehaviour,其写法是:
public class ResourceManager:Monobehaviour
{
public static ResourceManager instance;
void Awake()
{
instance = this;
}
}
继承MonoBehaviour之后就不要用前面的那种写法,不然你没法找到你想要的这个实例化的对象。因为本身脚本继承MonoBehaviour之后,当挂到GameObject之后就会自动的实例化对象。如果你再次调用构造函数,将会重新生成一个新的类对象,你用ResourceManager.instance调用的就是你新实例化的,而不是这个继承了MonoBehaviour的对象。

上面简单介绍了单例类的实现方式,在工程中我们管理类或者单例类肯定不止一个,那么我们就可以进一步的抽象一下单例类,让所有要使用单例的类继承该父类既可,写法如下:
public abstract class Singleton<T> where T:class
{
private static T _instance = null;
public static T instance
{
if(_instance == null)
_instance = new T();
return _instance
}
}
如果再写单例类就只用继承这个父类即可,比如:
public class ResouceManager:Singleton<ResourceManager>
{
//填写自己想要实现的方法和属性
}
PS:如有不对之处,请回帖一起讨论学习,关注AR学院以及AR助手微信公众号,谢谢!

图片:68_14_a728a0831681809.jpg

欢迎分享

归海一啸
管理员
管理员
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 喜欢达人
  • 原创写手
沙发#
发布于:2016-05-08 12:43
AR学院(www.arvrschool.com),从这里感触未来!
游客

返回顶部