Unity3D中的单例模式

一、C#下的单例模式

C#实现单例模式首先要看C# in Depth的一章Implementing the Singleton Pattern in C#

下面是链接:
http://csharpindepth.com/Articles/General/Singleton.aspx
介绍了Lazy和不Lazy的区别,线程安全。

下面是一个中文的更详细的解释说明
http://www.cnblogs.com/rush/archive/2011/10/30/2229565.html

其他文章基本上就是这些东西翻来覆去的讲,没有更多新意了,包括MSDN的文章。

二、怎么样不重复写代码

1)使用泛型

单例作为一个构造模式,实际上有两个要求
a)不能通过new关键字进行构造,只能通过GetInstance()获取实例。 (构造函数加private)
b)不能继承 (类加sealed)

而如果使用泛型,并且通过new关键字构造这个类,那这个类就必须要有一个公共的构造函数。这和单例模式是矛盾的。
一定要处理这个问题的话一个办法是使用反射。

但同样,如果能使用反射获得这个类的实例,那么整个单例模式都没什么意义,任何人总能获取到这个类的实例,所以还是不要自欺欺人了,就把构造函数公开出来算了。

https://www.codeproject.com/tips/696330/thinking-in-singleton-instead-of-a-useful-generic
一个使用反射实现的单例

2)使用Code Snippet功能
这确实也是一个解决方案,就看你是否可以忍受大量看起来重复的代码了。
https://stackoverflow.com/questions/380755/a-generic-singleton

三、Unity3D下的单例模式
Component创建实例的方法多了AddComponent(泛型或者非泛型版本)。

会让更多新手错误的创建一个单例出来(是么?)。
要保证Component的唯一,一般在Start或者Awake的时候检查instance,并且将多余的实例销毁掉。

当然,我并不觉得有什么必要。

http://wiki.unity3d.com/index.php/Singleton
https://unity3d.com/cn/learn/tutorials/projects/2d-roguelike-tutorial/writing-game-manager

另,目前的Unity(5.6)并不支持Lazy。

时间: 2024-11-05 23:36:48

Unity3D中的单例模式的相关文章

Unity3d中封装单例模式,Singleton

很多时候我们需要A脚本调用B脚本里面的属性什么的,这个时候我们可以在这个需要被调用属性脚本里面写一个单例模式.可项目大了需要被调用的脚本也就会很多,这个时候我们要是还像以前那样每个需要被调用的脚本里面就写一个单例模式,那样就太麻烦了.所以这里我们可以封装下这个单例模式. 写一个类: public class Singleton<T> where T :new(){ protected static T sInstance = default(T); public static T GetIns

在Unity3D中基于订阅者模式实现事件机制

??各位朋友,大家好,欢迎大家关注我的博客,我是秦元培,我的博客地址是http://qinyuanpei.com.今天博主想和大家分享的是在Unity3D中基于订阅者模式实现消息传递机制,我们知道Unity3D中默认提供了一种消息传递机制SendMessage,虽然SendMessage使用起来的确非常简单,可是它的这种简单是建立在付出一定的代价的基础上的.经常有朋友提及不同的模块间如何进行通信的问题,可能答案最终会落到单例模式.委托和事件机制这些关键词上,在这种情况下本文所探讨的内容可能会帮助

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致

(转)Unity3D中移动物体位置的几种方法

1. 简介 在unity3d中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position. 2. 通过Transform组件移动物体 Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale). 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position). 2.1 Transform.Tra

“只生一个娃”--设计模式中的单例模式

"只生一个娃"–设计模式中的单例模式(Singleton) 引言 ??被人问到什么是单例模式,突然回答不上来,似乎印象不深了.回去补了一下功课,突然明白了,原来在项目中一直使用的日志模块即采用了单例模式,只是熟视无睹,没有意识到罢了. ??所谓单例模式(Singleton),即指一个类只有一个实例(Instance),并给外界提供访问该实例的一个全局访问点. ??通常我们可以使用全局变量的方式来实现"只生一个娃",但更好的方法就是:让该类自身负责创建和保存它的唯一实

Windows系统Unity3D中的快捷键

[狗刨学习网] Windows系统Unity3D中的快捷键[td] 组合键 键 功能 File 文件 Ctrl   N New Scene 新建场景 Ctrl   O Open Scene 打开场景 Ctrl   S Save Scene 保存 Ctrl Shift S Save Scene as 保存场景为 Ctrl Shift B Build Settings... 编译设置... Ctrl   B Build and run 编译并运行 Edit 编辑 Ctrl   Z Undo 撤消 C

Unity3D中的Coroutine详解

Unity中的coroutine是通过yield expression;来实现的.官方脚本中到处会看到这样的代码. 疑问: yield是什么? Coroutine是什么? unity的coroutine程序执行流程怎么那么奇怪? unity中的coroutine原理是什么,怎么实现的? 使用unity的coroutine需要注意什么问题? 一.yield的在几种语言中的程序执行特性: Lua中的yield是使得协同函数运行->挂起并且传递参数给resume.resume使得协同函数挂起->运行

JAVA中的单例模式(采用单例模式定义的类)(转)

1     单例(Singleton)模式:单例模式确保某一个类只有一个 实例,而且该类只能是自己 实例化自己并向其他类公开 这个实例的对象创建 模式 采用单例模式的类:根据单例模式知道其要满足以下三点 1. 确保某一个类只有一个实例 2. 而且自己实例化 3. 并向其他类提供这个实例类 . 2    确保以上三点的所采用的编程策略     * 把构造方法声明为Private.确保只能由自己创建,避免外部创建实例或者被子类继承从而创造额外实例:    * 定义一个私有静态的该类的实例作为该类的数

Unity3D中定时器的使用

源地址:http://unity3d.9tech.cn/news/2014/0402/40149.html 在游戏设计过程中定时器是必不可少的工具,我们知道update方法是MonoBehavior中一个人人皆知的定时器方法,每帧都在调用,那还有其他什么定时器的方法呢,这里介绍一下. 1.Invoke(string methodName,float time) 在一定时间调用methodName函数 1 2 3 4 5 6 7 8 9 10 11 12 13 using UnityEngine;