Unity3D - 将一个字段的值与另一个字段或值进行比较的通用方法

时间:2015-12-24 17:33:04

标签: c# unity3d field system.reflection

在Unity3D上有一个名为“UnityEvent”的东西。我可以在任何类的任何实例上调用任何方法,只要该方法是公共的。它也有很好的GUI。

public class MyEventType : UnityEvent { }
public MyEventType OnEvent;
void Main(){
    OnEvent.Invoke();
}

我想要完成的是建立一个任务和对话系统。到目前为止,我可以使用这个东西来触发其他地方编写的事件。但是,如果它们的值更小,更小,相等,更小或相等,小于或等于任何给定值或不同变量,我还需要检查某些变量的东西。

例如: 我们的英雄来到医院。他和医生谈话。对话控制器必须检查玩家的健康状况(可通过character.stats.currentHP访问)是否小于其最大生命值(character.stats.maxHP),如果是,则屏幕上会出现一个选项“怎么了文档?”。

当然,我可以为每个对话选项使用不同的脚本,它会更简单,但重点是让那些不知道如何编写代码的人(比如我)建立任务和对话。我考虑过system.reflection,并且不知道如何使它工作。

2 个答案:

答案 0 :(得分:0)

您需要使用多态性。

您似乎希望任何项目都包含特定方法(如健康状况)。因此,您将拥有一个包含虚拟方法的抽象类:

public class HealthClass:MonoBehaviour{
     public virtual int GetHealth(){Debug.Log("Heath");}
}

public class ItemA:HealthClass{
     public override int GetHealth(){Debug.Log("A")}
}
public class ItemB:HealthClass{
     public override int GetHealth(){Debug.Log("B")}
}

您有一个类型为HealthClass的引用列表,您可以迭代以获取方法:

void Start(){
    List<HealthClass>list = new List<HealthClass>();
    GameObject a = new GameObject("ItemA", typeof(ItemA));
    list.Add(a.GetComponent<ItemA>);
    GameObject b = new GameObject("ItemB", typeof(ItemB));
    list.Add(b.GetComponent<ItemB>);
    foreach(HealthClass hc in list){ hc.GetHealth(); }
}

你会看到它调用正确的级别。这意味着您可以拥有相同的名称,不同的实现。更好的是一个界面,但是你失去了在督察中拖放的能力。

答案 1 :(得分:0)

使用System.Reflection解决了问题,我需要了解如何做我需要做的就是一遍又一遍地阅读文档直到我理解它为止。 显然我几乎只需要成对列出这些类:

public class FieldReference
{
    public GameObject gObject;
    public string component;
    public string fieldName;
    public string value {
        get {
            return gObject.GetComponent (component).GetType ().GetField (fieldName).GetValue (gObject.GetComponent (component)).ToString ();
        }
    }
}

编写一些代码来比较它们和自定义检查器编辑器。

我应该更频繁地阅读文档。