Unity全面入门笔记12-组件动态操作

对组件的动态操作

编译阶段自动添加组件

  • 前置组件

使用RequireComponent标签标记一个MonoBehaviour,则这个组件被附加到一个GameObject上时会检测是否已经附加了前置组件,如果没有,则自动添加前置组件。

[RequireComponent(typeof(CharactorController))]
public class UnitManager : MonoBehaviour
{
	
}

动态处理组件

  • 使用AddComponent给GameObject附加组件:
public T GameObject.AddComponent<T>();
public Component GameObject.AddComponent(Type componentType);

示例:下列三种用法结果是一致的

void Start()
{
    GameObject player = GameObject.Find("Player");
    
    PlayerController pc = player.AddComponent<PlayerController>();
    // PlayerController pc = player.AddComponent(typeof(PlayerController)) as PlayerController;
    // PlayerController pc = player.AddComponent(System.Type.GetType("PlayerController")) as PlayerController;
}
  • 使用GetComponent获得组件
public T GameObject.GetComponent<T>(); 
public Component GameObject.GetComponent(Type type);
public Component GameObject.GetComponent(string type);
public T[] GameObject.GetComponents<T>();
public Component[] GameObject.GetComponents(Type type);
public T GameObject.GetComponentInChildren<T>(bool includeInactive = false); 
public T GameObject.GetComponentInParent<T>(bool includeInactive = false); 
public T[] GameObject.GetComponentsInChildren<T>(bool includeInactive = false);
public T[] GameObject.GetComponentsInParent<T>(bool includeInactive = false); 

注:对一个GameObject尝试获取一个基类,可以返回该类的派生类。

  • 使用Destroy删除组件
public static void GameObject.Destroy(Component cpn);
public static void GameObject.Destroy(Component cpn, float delay);

和GameObject一致,可以设定删除的延迟时间。

由于this指向自己,所以组件可以做到删除自己:

Destroy(this);
  • 广播调用组件的方法

通过树型结构和反射写法,Unity提供了一个广播机制绕过多态编程调用组件上的函数。它们的作用是在不需要知道组件名称的情况下,调用组件中的方法。

public void Component.SendMessage(string methodName, object value = null); 
public void Component.BroadcastMessage(string methodName, object value = null); 
public void Component.SendMessageUpwards(string methodName, object value = null); 

SendMessage可以作用于该组件所附加的GameObject,遍历该GameObject上的所有组件,调用每个组件中的每一个名为methodName的public方法。使用广播调用方法时,可以填入一个任意类型的参数,也可以没有参数。如果想通过广播调用具有多个参数的方法,可以将参数打包为结构体,并重载一个单参数版本。

BroadcastMessage作用于该组件所附加的GameObject及其所有子结点,并产生和SendMessage一致的效果。

SendMessageUpwards作用于该组件所附加的GameObject及其父节点,并产生和SendMessage一致的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章