张力伪单例模式, 手机不能执行的一段代码,onEnable() OnDisable(), OnDestory()

1.张力伪单例模式

近几天,坐在我傍边的,交大研究生毕业的,搞通信结果来写代码的,名叫张力的程序员,在unity中写代码的时候,瞎几把乱写,弄了一个也不清楚是不是单例模式的,也不清楚有什么特性的单例模式,我深入看了下他的代码,总结了一下,便有了此想法.
要解决的主要问题就是引用的问题

  1. 如果你想要调用某个GameObject身上的某个脚本,但是又不想进行什么transform.Find()或者GameObject.Find()找来找去,甚至递归嵌套啥的
  2. 也不想直接通过拖拽的方式来进行获得其他物体上的脚本
  3. 还想让这个脚本中的单例指向最新生成的挂载此脚本的物体

这个时候你就可以使用这个伪单例模式了.
但是他毕竟是单例模式的,还是写在全局唯一的脚本中比较好,其实在代码层面,和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中销毁,但是不知道为什么

猜你喜欢

转载自blog.csdn.net/qq_40666620/article/details/108350017