继承mono的物体对象

在做内容的过程中会发现会发现我们手动实例的物体对象很难与unity已经在场景内的物体进行数据传输,例如实例的物体想控制场景内的面板、获取scene内的Gameobject挂挂载的某一脚本。因为unity物体在场景中生成时,该物体及其脚本已经实例了具体的对象(Gameobject obj = new Gameobject),我们在其他脚本中拿到该物体时已经是一个另外一个新的对象了,并没有拿到场景中该物体的引用。
利用继承来获取父类中的数据或物体对象也是不行的 - 父类只要继承了mono,在场景中挂载或生成时就已经成为一个单独的对象了。
不仅是挂载或生成,父类作为实例对象的挂载脚本,我们把子类作为参数调用其父类方法执行成员变量赋值操作,此时赋值给的父类对象是针对该方法调用时生成的一个新的父类实例,而不是我们是手动生成的实例对象。即:只要脚本挂载了mono,我们就很难在外部拿到它的引用,因此在生成的时候需要保存所有的mono对象。

  1. public class Son : Father
  2. {
  3. public string num;
  4. public SonExtend extend;
  5. void Update()
  6. {
  7. if (Input.GetMouseButtonDown(1))
  8. {
  9. num += 1;
  10. //此处传入的NewBehaviourScript不是真正实例出来的对象,而是这个方法帮我们新实例的一个对象
  11. extend.excute(this,num);
  12. }
  13. }
  14. }
  15. public class SonExtend : MonoBehaviour
  16. {
  17. public void excute(Father behaviourScript,string num)
  18. {
  19. behaviourScript.showMessage(num);
  20. }
  21. }
  22. //Father挂载在预制体身上 通过脚本动态生成及销毁,销毁时debug
  23. public class Father : MonoBehaviour
  24. {
  25. private string fatherNum;
  26. private void OnDestroy()
  27. {
  28. Debug.Log(fatherNum);
  29. }
  30. public void showMessage(string num)
  31. {
  32. Debug.Log("AAA " + num);
  33. this.fatherNum = num;
  34. }
  35. }
  36. //测试执行
  37. //Debug.Log("AAA " + num);方法输出没问题,但是Debug.Log(fatherNum);为默认值null

获取引用

在生成所有带有mono物体对象时把它保存在列表内备用。
要获取某个物体对象的引用,就需要用到委托和事件。
如果监视面板内物体存在父子物体关系,可以使用 目标物体对象.SendMessage();
TargetGgameobject.SendMessage(); // 向自身物体的脚本发送消息
TargetGgameobject.SendMessageUpwards(); // 向自身或父物体的脚本发送消息
TargetGgameobject.BroadcaseMessage(); // 向自身或父物体的脚本发送消息