对组件的动态操作
编译阶段自动添加组件
使用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;
}
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尝试获取一个基类,可以返回该类的派生类。
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一致的效果。