今天在构思函数上有了一些感觉,通过学习一些基本的语句发现了连接脚本的一些算法,首先我是先从理解Destory,其为毁灭性函数一旦使用就不能够再后面加后续函数控制其功能。并且Destroy若后面出现代码接着访问此代码就会出现异常,目前为止我仅仅空想出了俩个方案进行改进,第一种是用setactive进行角色隐藏再被击杀或死亡时将人物隐藏起来,从而弹出界面,而第二种在网上找到了一些前辈的方法
解决方案:
对物件进行封装, 外部访问时不直接操作物件, 而通过接口调用, 删除或放回池里时, 断开该引用即可
using UnityEngine;
using System.Collections.Generic;
public class MyGameObject
{
//缓存池//
private static Queue m_map = new Queue();
private static GameObject m_root;
//创建一个节点//
public static MyGameObject Create(MyGameObject parent, string name)
{
GameObject obj;
if (m_map.Count > 0)
obj = m_map.Dequeue();
else
obj = new GameObject();
obj.name = name;
if (parent != null && parent.IsExist())
obj.transform.parent = parent.gameObject.transform;
else
obj.transform.parent = null;
MyGameObject ret = new MyGameObject();
ret.gameObject = obj;
return ret;
}
//删除一个节点//
public void Delete()
{
if (IsExist())
{
m_map.Enqueue(gameObject);
if (m_root == null)
{
m_root = new GameObject(“GameObjectMap”);
Object.DontDestroyOnLoad(m_root);
}
gameObject.transform.parent = m_root.transform;
}
gameObject = null;
//最好这里可以实现自身的回收–Lua//
}
//实际节点//
private GameObject gameObject;
//私有构造//
private MyGameObject(){ }
//节点有效判断//
public bool IsExist() { return gameObject != null; }
//其他逻辑实现//
public T GetComponent() where T : Component
{
if (IsExist()) return gameObject.GetComponent();
return null;
}
}
通过MyGameObject.Create()去获取一个节点, 外部拿到的只是一个访问器, 通过Delete()函数来释放自己, 将私有实际物体设置为null后, 外部就不可操作具体的对象.
如果利用第二种方案我将改变我全部公程,但我有这种决心。