【问题标题】:List of methods to assign to various classes C#分配给各种类 C# 的方法列表
【发布时间】:2012-08-02 13:30:18
【问题描述】:

我在 Unity 中有一个沙盒世界,其中包含各种游戏对象,最终会有一组交互,玩家可以在单击该对象后从中进行选择(最好的例子是《模拟人生》)。

我基本上希望每个对象都包含一个方法列表,这些方法是从另一个方法列表中分配的。所以也许有一个带有“摇动”方法的树,我想将“摇动”方法分配给树的交互列表,但摇动方法是在另一个类中定义的。我也可能有一辆车也可以有“摇”的方法。

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

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

并且这个列表可以填充方法,但这是我上面解释的最佳解决方案吗?我能否以某种方式拥有一个包含所有可能交互的 Enum,它会自动调用特定 GameObject 的特定方法?

【问题讨论】:

  • 您所提出的是一个合理的解决方案,基于您分享的少量内容。你想用枚举做什么?
  • @DanPuzey 我的想法可能有点错误,但我有一个可用交互列表,例如Enum Interaction{ Shake, Climb },我可以将其分配给List&lt;Interaction&gt;,以便更轻松地调用交互

标签: c# list action unity3d


【解决方案1】:

我不确切知道您想要实现什么以及它是否是最佳解决方案,但对我来说,这听起来像是策略模式的一个很好的用途:

// 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()
    {
        ....
    }
}

【讨论】:

  • 如果您添加了Name 属性,那么也不需要发布者建议的enum
  • 感谢您的建议,我喜欢为Interaction 使用接口的想法。我基本上是在尝试为各种不同的对象重用预定义的交互。所以我可能必须为包含 List&lt;IInteraction&gt; 的对象提供一个 IIteractive 接口
【解决方案2】:

解决此问题的一种方法是将每个动作定义为它们自己的 MonoBehavior 脚本。然后,您需要做的就是将每个行为作为一个组件附加到每个游戏对象。

这需要你改变在另一个类中定义所有动作的模式,但应该保持干净。

然后要执行每个操作,您只需检查该游戏对象是否具有该组件并执行其操作。 Shake s = gameObject.GetComponent<Shake>();
if(s != null)
{
s.Shake(shakeParameters);
}

【讨论】:

  • 这也是一个不错的建议。所以我可以拥有一个包含可能交互类的整个文件夹,我可以简单地附加它们和GetComponent。但是无论如何我可以在这些类上定义IInteraction 接口,然后在void Start 上检查我所有的对象组件与IInteraction 并添加到列表中。让他们更容易打电话。
  • 绝对。每个类都必须从 MonoBehavior 继承,但您也可以让它们实现您想要的任何其他接口。制作一个 IInteraction 接口,它定义了一个 DoInteraction 方法或其他任何东西,这应该可以工作。您也可以有多个接口,例如带有DoItNow 方法的IInstantAction,以及带有StartActionStopAction 方法的IPassiveAction 接口。所以它只是class MyClass : MonoBehaviour, IInteraction
猜你喜欢
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多