1.张力伪单例模式
近几天,坐在我傍边的,交大研究生毕业的,搞通信结果来写代码的,名叫张力的程序员,在unity中写代码的时候,瞎几把乱写,弄了一个也不清楚是不是单例模式的,也不清楚有什么特性的单例模式,我深入看了下他的代码,总结了一下,便有了此想法.
要解决的主要问题就是引用的问题
- 如果你想要调用某个GameObject身上的某个脚本,但是又不想进行什么transform.Find()或者GameObject.Find()找来找去,甚至递归嵌套啥的
- 也不想直接通过拖拽的方式来进行获得其他物体上的脚本
- 还想让这个脚本中的单例指向最新生成的挂载此脚本的物体
这个时候你就可以使用这个伪单例模式了.
但是他毕竟是单例模式的,还是写在全局唯一的脚本中比较好,其实在代码层面,和unity中单例模式的差别还是很小的
代码结构如下:
public class Manager : MonoBehaviour
{
//伪单例模式,方便调用而已
private static Manager _instance;
public static Manager ManagerInstance
{
get{return _instance;}
}
private void Awake() {
_instance = this;
}
}
根据上面的代码可以看出,只不过是声明了该脚本的一个静态的实例,然后暴露出来get方法,最后在Awake()里面,让实例 = this
, 这样会造成如果有多个带有该脚本的物体实例化,那么该实例只会指向最后生成的实例.
如果我们换一种写法,如下:
public class Manager : MonoBehaviour
{
private static Manager _instance;
public static Manager ManagerInstance
{
get{return _instance;}
}
private void Awake() {
if(_instance != null)
{
Destory(this.gameObject);
return;
}
_instance = this;
}
}
上面的写法,无论有多少个物体绑了此脚本,此脚本中的单例都会指向第一个生成的,但是优点是会保存从单例生成开始到当前的数据,这种格式对于保存数据比较友好.
2.手机不能执行的一段代码
class Program {
static void Main(string[] args) {
StreamReader srReadFile = new StreamReader("data.json");
string jsonText = "";
while (!srReadFile.EndOfStream) {
jsonText += srReadFile.ReadLine();
}
JObject jo = (JObject)JsonConvert.DeserializeObject(jsonText);
}
}
类似于上面这样的一段代码,在windows中的unity可以运行,但是android手机中就不能运行了,有大神看到欢迎来解释一下
3. ``onEnable() OnDisable(), OnDestory()对应关系
其实看名字就很清楚了
当可用
肯定是和当不可用
是对应的
当销毁
肯定是和当初始化
对应的
所以对应关系是
onEnable
<=> OnDisable
Awake()
<==> OnDestory
其中
onEnable
会在初始化 和 SetActive(true)时调用
onDisable
会在SetActive(false) 和 Destory时调用
Awake()
会在初始化的时候调用
onDestory
会在物体销毁的时候调用
遇到这个问题就是在onEnable中进行了一些数据的读取,在onDestory中销毁,但是不知道为什么