📜  统一获取 self 组件 - C# (1)

📅  最后修改于: 2023-12-03 15:41:18.182000             🧑  作者: Mango

统一获取 self 组件 - C#

在 C# 开发中,我们经常需要在某个类的内部获取其自身的某个组件或者控件。一般情况下,我们可以通过在类中定义一个变量,然后在构造函数中将组件或者控件赋值给该变量来实现。但是如果有多个组件或者控件都需要在类内部被使用,这种方法就显得比较繁琐,而且容易让代码变得臃肿。因此,我们需要一种更加便捷的方法来统一获取 self 组件。

获取 self 组件的方法

一种较为简单的方法是通过在 Unity 中的“Require Component”工具来获取 self 组件。具体方法如下:

1.在 Unity 中,选中需要绑定组件的 GameObject,在 Inspector 窗口中找到 Add Component(添加组件)按钮。

2.点击 Add Component 按钮,在搜索栏中输入 “Require Component”,选择它。

3.在“Require Component”组件的属性面板中,勾选你需要的组件类型。

4.在 C# 类中,通过该组件类型就可以直接获取对应的组件。

例如:

using UnityEngine;
     
public class Example : MonoBehaviour {
    Rigidbody rigidBody;
     
    void Start () {
        rigidBody = GetComponent<Rigidbody>();
        if (rigidBody == null) {
            Debug.LogError("Rigidbody is missing.");
        }
    }
}

在该篇代码中,rigidBody 变量通过 GetComponent() 获得了 Rigidbody 组件。

统一获取 self 组件的方法

虽然在 Unity 中的“Require Component”工具可以帮助我们简单地获取组件,但是在某些场景下,我们可能需要在代码中动态地获取多个组件,此时使用“Require Component”工具就不太方便了。针对这种情况,我们可以在类的构造函数中通过反射获取类的成员变量,并筛选出需要的组件进行初始化。具体方法如下:

using System.Reflection;
using UnityEngine;
     
public class Example : MonoBehaviour {
    Rigidbody rigidBody;
    Collider collider;
    MonoBehaviour script;
     
    void Start () {
        InitComponents();
    }
     
    void InitComponents() {
        FieldInfo[] fields = GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        foreach (FieldInfo field in fields) {
            if (field.FieldType == typeof(Rigidbody)) {
                rigidBody = GetComponent<Rigidbody>();
                field.SetValue(this, rigidBody);
            } else if (field.FieldType == typeof(Collider)) {
                collider = GetComponent<Collider>();
                field.SetValue(this, collider);
            } else if (field.FieldType == typeof(MonoBehaviour)) {
                script = GetComponent<MonoBehaviour>();
                field.SetValue(this, script);
            }
        }
    }
}

在以上代码中,我们通过类的“Type”对象的“GetFields”方法获取到该类的所有成员变量(包括公有成员和私有成员),并将其存储在“FieldInfo”数组中。然后,我们可以通过反射动态地获取成员变量的值,并根据其类型动态地获取对应的组件。最后,我们可以直接将该组件赋值给对应的成员变量。

结语

以上就是关于在 C# 中统一获取 self 组件的方法的介绍。通过使用以上方法,我们可以更加方便地获取 self 组件,避免了在代码中频繁地进行 GetComponent 操作,提升了代码的可读性和可维护性。