- 浏览: 261444 次
- 性别:
- 来自: 大连
文章分类
最新评论
在Unity3D中可以用不同的方法来实现单例,第一种是通常用法,第二种是自我包含法,第三种方法粗制滥造法,第四种是为C#开发者准备的,计数器法。
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
然后你就可以用以下方士简单而粗制滥造的访问它:
1.通常用法
通常用法是在相关类加入GetInstance()的静态方法,检查实例是否存在。如果存在,则返回。如果不存在,则返回一个“需要用游戏元素类关联”的调试警告错误.
public class MyClass { private static MyClass instance; public static MyClass GetInstance() { if (!instance) { instance = GameObject.FindObjectOfType(typeof(MyClass)); if (!instance) Debug.LogError("There needs to be one active MyClass script on a GameObject in your scene."); } return instance; } }
2.自我包含法
有一次玩Trench Run game,我意识到我的场景类里存在许多的GameObject。所以,我开发了自我包含的单例。如果没找找到实例,就会创建它自己的GameObject,注重通过AddComponent()方法返回来关联实例类,而不需要在IDE中创建一个GameObject在设计时弄乱你的场景。
public class Logger : MonoBehaviour { private static Logger instance; private static GameObject container; public static Logger GetInstance() { if( !instance ) { container = new GameObject(); container.name = "Logger"; instance = container.AddComponent(typeof(Logger)) as Logger; } return instance; } }
3.粗制滥造法
粗制滥造法很简单,为实例设置一个公共静态属性,初始化Awake()方法,设计时关联一个GameObject. 可以用以下方法访问:
MyClass.instance.DoSomething(); public class MyClass { public static MyClass instance; public void Awake() { MyClass.instance = this; } }
在ActionScript里访问外在类的其他方法比访问一个属性要慢很多,我不知道这是否属实(我怀疑),但是在过去几年里我在Flash上噩梦般的优化,我通常用的是这种方法。也许有些习惯永远也改不了的!(或者我本来就偏执于此)
4.计数器法
以上的第一种方法和第二种方法得利于使用访问器而不是一个方法。关于本提示要感谢Cliff Owen.
public class MyClass { private static MyClass _instance; public static MyClass Instance { get { if (!_instance) { _instance = GameObject.FindObjectOfType(typeof(MyClass)); if (!_instance) { GameObject container = new GameObject(); container.name = "MyClassContainer"; _instance = container.AddComponent(typeof(MyClass)) as MyClass; } } return _instance; } } }
然后你就可以用以下方士简单而粗制滥造的访问它:
MyClass.Instance.DoSomething();
发表评论
-
unity Mathf 数学运算(C#)
2013-05-14 15:32 4002Mathf 数学运算Mathf.Abs绝 ... -
Unity3D与VS2008结合
2013-03-07 13:24 2949mono出问题了,打开之后总是没反应,憋的我只能另想办法了,还 ... -
按自身本地坐标移动
2012-11-09 11:10 0transform.Translate( new Vector ... -
Transform.eulerAngles
2012-09-19 11:20 6065eulerAngles的三个变量,x,y,z表示三个绕坐标轴旋 ... -
UNITY3D开发IOS 强制屏幕四个方向不旋转的方法
2012-09-18 13:32 7200void Start () { //纵向 上下 ... -
复杂材质烘焙成一张贴图
2012-09-17 13:34 2394这个脚本可以将复杂的材质,比如有法线贴图的材质进行" ... -
Unity Mathf 数学运算(C#)
2012-09-17 10:27 107477Mathf.Abs绝对值 计算并返回指定参数 f 绝对值。 ... -
xxx.unity3d 这种文件怎么打开呢`
2012-09-03 10:26 0unity3d是在unity编辑器下编辑模型,然后使用unit ... -
unity3d协作过程中svn的使用
2012-06-20 14:42 1513算是从unity3d官方网站上的翻译,如果你没有看到,可以看下 ... -
unity3d换贴图
2012-04-25 11:51 0//换贴图,直接把这段代码加在要换贴图的模型上即可 ... -
unity3d 修改 webplayer 的logo
2012-03-30 13:48 3861经过测试,以下两种方式都是可以的。 第一种,加到<sc ... -
[转载]Unity3d闪烁灯光脚本
2012-03-29 09:05 1807using UnityEngine; using ... -
Unity引擎链接mySQL数据库
2012-03-29 08:58 5014需要unity3d3.5 pro版本,所以先确认自己用的是不是 ... -
在Unity3D里使用JSON格式进行数据交换(转)
2012-03-29 08:55 12656这个例子里做的事情很简单,主要做了两件事: 1 从服务器的p ... -
unity3d调用外部摄像头
2012-03-26 15:24 0public string deviceName; ... -
天气系统
2012-03-21 08:37 0var lightmapFarsFirst:Texture ... -
Unity3D鼠标响应事件
2012-03-19 10:14 0void OnMouseDrag () { ... -
javaScript改变skybox
2012-03-07 23:38 1060var dayMaterial:Material; va ... -
Unity 3D 入门常见问题
2012-02-29 10:12 3771下面列出了常见的问题. 文档 Unity 手册 -- 包含用 ... -
UNITY3D常用代码
2012-02-28 08:51 001、基本碰撞检测代码 function OnCollis ...
相关推荐
在Unity中实现单例模式的最佳方法。 通过使用这种模式,您将能够定义Global变量和类,并在Global中使用它们的方法和属性。 对于使用Unity引擎制作的大多数游戏来说,这种模式都是必须的。 :open_book: 产品特点 ...
示例Unity项目可在找到。 为什么 为什么要使用yaSingleton,为什么要使用ScriptableObjects? 在不同场景中没有单例的重复实例。 保证可以在任何Awake脚本之前运行的单入口点。 轻松的版本控制。 由于单例另存为...
里边一共包含了三个基本的单例类型,分别为 1非游戏对象单例 2随场景切换而销毁的单例 3不随场景切换而销毁的单例 其中2 3 中有一段可以自动创建单例对象的代码已注释 使用方法 继承对应的父类并在泛型中指明自己 ...
课时20 单例设计模式Singletons 基础入门之进入Unity的世界 课时1 Unity介绍 课时2 Unity下载和安装 课时3 Unity 破解 课时4 Unity 什么是工程 课时5 Unity 学习过程介绍 课时6 Unity中的五种视图 课时7 Unity中的...
Unity3D 项目的简单 GameManager 类。 SimpleGameManager 类使用单例模式实现,并在类实例上使用 DontDestroyOnLoad 函数。它是一个基于枚举状态的类,可用于操作项目中的所有游戏状态。 更多详情、使用方法,请...
创建型模式:共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式:共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式:共十一种:...
Send.cs类使用单例模式发送,获取UPD消息.cs类负责消息接受,UDP消息处理.cs类负责消息的处理,因为我经常使用UDP功能,所以我整合了一下,非常方便使用,只要把“获取UPD消息.cs”和“UDP消息处理.cs”拖到一个对象...
由于unity3d现在热更的主要方式还是以lua为主,lua就成了手游开发必不可少的技能之一,而单例模式不可避免的要被使用,例如:数据管理器,游戏管理器,UI管理器等,那么有个好的单例基类就可以节约好多代码,让你...
软件模式:OOP,合成,单例,对象池,观察者,... 组合与OOP:接口+继承与通过组件的对象组合 MonoBehaviour +扩展 序列化 习语:一对多 事件:C#委托事件与UnityEvents 协程 最佳化 工作流程选择 总体过程: 您...
开发讲解以上内容涉及到: 代理模式、单例模式、访问者模式、责任链模式(新手引导应用)等在实战项目中的具体灵活应用,以及大量商业项目底层核心技术例如: 企业日志系统(高级bug调试排错系统)、新手引导、背包...
关于我的存储库-ReedMe的全部 ...其他框架-单例模式,对象池,加载场景,UI,声音 安装? :locked: Unity TowerDefense游戏 语言:C# 工具:Unty 项目类型:个人项目,负责所有 该项目正在进行中。 最近,我实