2015-12-24 67 views
2

在Unity3D上有一些名爲「UnityEvent」的內容。只要方法是公開的,我可以在任何類的任何實例上調用任何方法。它也有很好的GUI。Unity3D - 將一個字段的值與另一個字段或值進行比較的通用方法

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

我試圖完成的是做一個任務和對話系統。到目前爲止,我可以使用這個事件來觸發其他地方腳本化的事件。但是,我還需要一些能夠檢查某些變量,如果它們的值小於,小於,等於,小於或等於,小於或等於任何給定值或不同變量。

例如: 我們的英雄來到醫院。他與一位醫生會談。對話控制器必須檢查玩家的健康狀況(可通過character.stats.currentHP訪問)是否小於其最大健康狀況(character.stats.maxHP),如果是,則屏幕上會出現一個選項「What's up doc?」。

當然,我可以爲每個對話選項使用不同的腳本,它會更簡單,但重點是讓不知道如何編寫代碼的人(像我一樣)構建任務和對話。我想過system.reflection,並不知道如何使它工作。

+0

所以你說你想運行不同的腳本取決於不同的字符屬性狀態?我不太明白你想要達到的目標。 – neo

+0

@neo一個函數,它將循環訪問未知類型元素的引用列表(?),將每個元素與給定值或同一類型的不同元素進行比較。 – ImAlive

+0

通過反思,您可以找出手中的類型並確定如何處理它。什麼是給你帶來困難的部分? – neo

回答

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(); 
     } 
    } 
} 

編寫一些代碼來比較它們和一個自定義檢查編輯器。

我應該更頻繁地閱讀文檔。

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(); } 
} 

你會看到,它稱爲正確的水平。這意味着你可以有相同的名稱,不同的實現。更好的是一個界面,但是你失去了在檢查員中拖放的能力。

相關問題