2012-08-02 86 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