2012-08-02 126 views
1

這可能是有點難explane所以請與我裸...列表分配到不同類別C#

我有一個團結沙盒世界各種GameObjects,最終將有一組相互作用的那玩家可以選擇一旦他們點擊這個對象(最好的例子是模擬人生)。

我基本上希望每個對象都包含一個從另一個方法列表中分配的方法列表。所以也許有一個樹與「搖」的方法,我想分配「搖」方法樹的交互清單,但搖的方法是在另一個類中定義。我也可能有一輛車也可能有「搖」的方法。

我知道我可以有一個Action列表。

List<Action> interactions = new List<Action>(); 

而且該名單可以用方法來填充,但是這是什麼我上面所解釋的最佳解決方案,並且我可以以某種方式有一個枚舉所有可能的交互這會自動調用特定的方法爲特定的遊戲對象?

任何建議將非常感謝!凱斯。

+0

你提出的是一個合理的解決方案,基於你分享的東西。你想使用枚舉的什麼? – 2012-08-02 13:33:06

+0

@DanPuzey我也許在想它有點不對,但我有一個可用的交互列表,例如'Enum Interaction {Shake,Climb}',我可以將它們分配給一個'列表'以使調用交互更容易 – 2012-08-02 13:39:05

回答

2

我不知道你想什麼來實現,以及它是否是最好的解決辦法,但對我來說這聽起來像一個很好用的策略模式:

// This is the 'strategy' in your case 
public interface IInteraction 
{ 
    void Do(); 
} 

public class GameObject 
{ 
    // Here is your list of interactions - you can do whatever you want with it. 
    public List<IInteraction> Interactions { get; set; } 
} 

// Here is an interaction 
public class Shake : IInteraction 
{ 
    public void Do() 
    { 
     .... 
    } 
} 
+1

如果添加了一個'Name'屬性,然後海報建議的'enum'也不需要。 – 2012-08-02 13:41:27

+0

感謝這個建議,我喜歡使用'Interaction'接口的想法。我基本上試圖爲各種不同的對象重用預定義的交互。所以我可能必須爲包含'List '' – 2012-08-02 13:46:35

1

一種方法來此將每個動作定義爲它們自己的MonoBehavior腳本。然後你需要做的就是將每個行爲作爲一個組件附加到每個遊戲對象上。

這將需要你改變你在另一個類中定義所有動作的模式,但應該保持乾淨。

然後,要執行每個操作,您只需檢查該gameobject是否具有該組件並執行其操作。 Shake s = gameObject.GetComponent<Shake>();
if(s != null)
{
s.Shake(shakeParameters);
}

+0

的對象設置'IIteractive'接口。這也是一個很好的建議。所以我可以有一個可能的交互類的完整文件夾,我可以簡單地附加和'GetComponent'。但無論如何,我可以在這些類上定義'IInteraction'接口,然後在'void Start'中檢查我的所有對象組件,並將它們添加到列表中。讓他們很容易打電話給他們。 – 2012-08-02 13:50:32

+0

絕對如此。每個類都必須從MonoBehavior繼承,但你也可以讓它們實現你想要的任何其他接口。創建一個'IInteraction'接口,該接口定義了一個'DoInteraction'方法或其他方法,並且應該可以工作。你也可以有多個接口,比如帶有DoItNow方法的'IInstantAction'和帶'StartAction'和'StopAction'方法的'IPassiveAction'接口。所以它只是'class MyClass:MonoBehaviour,IInteraction' – Liron 2012-08-02 18:06:42