Unity中实现全局管理类的几种方式
(搬运自我在SegmentFault的博客)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别。
第一种方式是使用静态类。适合存储一些全局的变量,如游戏当前关卡、玩家得分等。
实现方式和普通的C#静态类没有差别。注意使用静态类就没有必要继承MonoBehaviour了。
如果要实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类。
单例类的实现又分为两种:
- 继承自MonoBehaviour的单例类
- 纯C#的单例类
前者的优点是:
- 可以在Inspector中显示,便于赋值和查看变量等;
- 可以利用MonoBehaviour的接口;
- 可以使用Coroutine。
- 等等。
缺点也很多,主流的观点是能不继承MonoBehaviour就不要继承。
纯C#的单例类
实现起来简洁,易于理解。
普通的写法,不考虑多线程
public class MyClass
{
private static readonly MyClass _instance = new MyClass();
public static Class Instance {
get {
return _instance;
}
}
private MyClass() {}
}
线程安全的写法
检查两次。C#中使用lock关键字。
public class MyClass
{
private static volatile MyClass _instance;
private static object _lock = new object();
public static MyClass Instance
{
get
{
if (_instance == null)
{
lock(_lock)
{
if (_instance == null)
_instance = new MyClass();
}
}
return _instance;
}
}
private MyClass() {}
}
基于MonoBehaviour的单例类
普通的写法
利用了Unity的运行机制,从Awake处获取Unity创建的对象作为单例。
注意在Unity中不要使用new来创建MonoBehaviour实例。
public class MyClass : MonoBehaviour
{
static MyClass _instance;
void Awake () {
_instance = this;
}
public static MyClass Instance {
get {
// 不需要再检查变量是否为null
return _instance;
}
}
}
持久化的写法
在多个场景中保存单例。又有两种方法。
第一种是使用DontDestroyOnLoad方法,告诉Unity不要销毁实例所在的对象,然后将脚本挂到某个GameObject上:
public class MyClass : MonoBehaviour
{
static MyClass _instance;
void Awake () {
_instance = this;
// 防止载入新场景时被销毁
DontDestroyOnLoad(_instance.gameObject);
}
public static MyClass Instance {
get {
return _instance;
}
}
}
上面这个方法有个弊端,必须要从挂载了这个单例的GameObject所在的场景启动,否则会找不到GameObject对象。但是开发和测试时我们经常会单独启动一个场景。
另一种方法会创建一个GameObject,然后将单例挂载到其上:
public class MyClass : MonoBehaviour {
static MyClass _instance;
static public MyClass Instance
{
get
{
if (_instance == null)
{
// 尝试寻找该类的实例。此处不能用GameObject.Find,因为MonoBehaviour继承自Component。
_instance = Object.FindObjectOfType(typeof(MyClass)) as MyClass;
if (_instance == null) // 如果没有找到
{
GameObject go = new GameObject("_MyClass"); // 创建一个新的GameObject
DontDestroyOnLoad(go); // 防止被销毁
_instance = go.AddComponent<MyClass>(); // 将实例挂载到GameObject上
}
}
return _instance;
}
}
}
Unity中实现全局管理类的几种方式的更多相关文章
- 【转】【Unity】实现全局管理类的几种方式
本文原作者未知,转载自:http://blog.csdn.net/ycl295644/article/details/42458477 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和 ...
- 【Unity3D游戏开发】之全局管理类的几种方式 (十六)
如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合存储一些全局的变量,如游戏当前关卡.玩家得分等 ...
- Unity中资源动态加载的几种方式比较
http://blog.csdn.net/leonwei/article/details/18406103 初学Unity的过程中,会发现打包发布程序后,unity会自动将场景需要引用到的资源打包到安 ...
- Unity协程(Coroutine)管理类——TaskManager工具分享
博客分类: Unity3D插件学习,工具分享 源码分析 Unity协程(Coroutine)管理类——TaskManager工具分享 By D.S.Qiu 尊重他人的劳动,支持原创,转载请注明出处 ...
- Mybatis中使用association进行关联的几种方式
这里以一对一单向关联为例.对使用或不使用association的配置进行举例. 实体类: @Data @ToString @NoArgsConstructor public class IdCard ...
- Struts2中获取HttpServletRequest,HttpSession等的几种方式
转自:http://www.kaifajie.cn/struts/8944.html package com.log; import java.io.IOException; import java. ...
- javascript创建类的6种方式
javascript创建类的7种方式 一 使用字面量创建 1.1 示例 var obj={}; 1.2 使用场景 比较适用于临时构建一个对象,且不关注该对象的类型,只用于临时封装一次数据,且不适合代码 ...
- 聊聊业务系统中投递消息到mq的几种方式
背景 电商中有这样的一个场景: 下单成功之后送积分的操作,我们使用mq来实现 下单成功之后,投递一条消息到mq,积分系统消费消息,给用户增加积分 我们主要讨论一下,下单及投递消息到mq的操作,如何实现 ...
- 【Java8新特性】面试官问我:Java8中创建Stream流有哪几种方式?
写在前面 先说点题外话:不少读者工作几年后,仍然在使用Java7之前版本的方法,对于Java8版本的新特性,甚至是Java7的新特性几乎没有接触过.真心想对这些读者说:你真的需要了解下Java8甚至以 ...
随机推荐
- JEECMS-新闻内容中遍历批量上传的图片
[#list content.pictures as p] <li value="${p_index+1}"> <img src="${p.imgPat ...
- winform防止界面卡死的三种方法
在编程过程中经常会遇到耗时操作,这个时候如果不采取一些必要的异步操作,就会导致界面的卡死,这里以winform为例子,介绍三种方法防止界面卡死,对这几个方法稍加修改同样适用于wpf,silverlig ...
- python3登陆接口测试
Python3和Python2有很大的语法区别,在实际的项目中,要注意格式.今天用Python3做一个接口测试,由于没有经验,用Python2的语法,调了半天没有搞定,后来一个大神指点了一下,终于拨开 ...
- poj1088(記憶化搜索)
題目鏈接:http://poj.org/problem?id=1088 題意:中文題誒- 思路:dfs,不過直接dfs因該會超時,那我們給他加個記錄路徑就好了... 代碼: #include < ...
- Netty源码分析(七):初识ChannelPipeline
ChannelPipeline单看名称就可以知道Channel的管道.本篇将结合它的默认实现类DefaultChannelPipeline来对它做一个简单的介绍. 示例图 上图是官方提供的Channe ...
- 道阻且长 莫失本心(我的OI之旅
道阻且长 莫失本心 今天午睡醒来,发现自己发烧了.尽管穿的很厚,尽管今天的阳光如此明媚.身体还是由内而外地散发着冷意. 期末考已经结束了,接下来又是艰难而难忘的奥赛训练.(要到春节才能放假了 ...
- EOS帐户交易的构建命令
EOS版本:4.0 系统:Ubuntu 16.04 LTS 1.创建两对密匙 cleos create key Private key:5JeTwSwKfpVRHGLqysakTXfk ...
- Codeforces Round #564 (Div. 2) B. Nauuo and Chess
链接:https://codeforces.com/contest/1173/problem/B 题意: Nauuo is a girl who loves playing chess. One da ...
- atom通过remote ftp同步本地文件到远程主机的方法
视频教程:https://ninghao.net/video/3991 搜索 “remote ftp”, 点击 “Package”搜索包,Install”安装 本地打开需要同步的项目目录 创建 rem ...
- 转 SecureCRT 遇到一个致命的错误且必须关闭——解决
http://blog.csdn.net/lisheng19870305/article/details/45537759 问题描述: 1.以前安装过SecureCRT,现在出现问题,手工卸载不完全, ...