c# - 在 Unity 中建立组件之间关系的最佳做法是什么?

标签 c# unity3d

当我尝试考虑 Unity 中的游戏架构时,我面临以下问题:在组件之间建立关系有多种方法,我无法理解哪种方法是最佳的。

例如,我们有具有以下参数的 GameplayObject 组件

public class GameplayObject : MonoBehaviour
{
    // every gameplay object has chanse of appear on board
    [SerializeField, Min(0)] int m_ChanseOfAppear = 0;

    public int ChanseOfAppear => m_ChanseOfAppear;

    //every gameplay object may be destroyed
    public virtual void Destroy()
    {

    }
}

销毁方法可以在用户输入后执行(点击或拖动只是输入的几种类型)或者另一个游戏对象可以执行销毁方法。 例如,我们有以下 TapBehaviour 组件

public class CustomDestroyer: MonoBehaviour, IPointerClickHandler
{    
    public event System.Action OnTap = delegate { };

    IPointerClickHandler.OnPointerClick()
    {
         OnTap();
    }
}

我们有具体的 GameplayObject(例如 CustomDestroyer),它应该以具体的方式销毁对象。现在它需要我们的输入组件的依赖

[RequireComponent(typeof(TapBehaviour), typeof(BoxColiider2D))]
public class CustomDestroyer: GameplayObject 
{
    TapBehaviour m_TapBehaviour;
    TapBehaviour TapBehaviour
    {
        get
        {
            if (m_TapBehaviour == null)
                m_TapBehaviour = GetComponent<TapBehaviour>();
            return m_TapBehaviour;
        }
    }


    public override void Destroy()
    {

    }
}

但我们可以用相反的方式来做:从 TapBehaviour 继承 CustomDestroyer 并像组件一样使用 GameplayObject。

所以主要问题是您如何构建项目的架构?什么时候使用组件的继承,什么时候只使用组件?可能是我失去了一些更可取的方式?

你给我解释的越多,我就越感激你!

对不起,英语不好,只是学习。

最佳答案

Unity 在架构方面提供了很大的自由度,当您可以通过多种不同的方式成功地完成工作时,有时会让人不知所措。关于你的问题——就 future 的验证而言,我倾向于使用单独的组件(也就是单一责任),使用接口(interface)松散地捆绑在一起(比如 IDestroy 而不是具体类型),这个想法是尽可能避免组件的相互依赖。

但在很多情况下,带覆盖的继承会很好,并且重构通常是无痛的(如果你走得太远,有很多方法可以自动执行编辑器任务)所以我的建议是:不要使事情过于复杂,尽可能简单,但不要简单

关于c# - 在 Unity 中建立组件之间关系的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56018810/

相关文章:

c# - .NET 中的可取消排序?

c# - Windows 应用商店验证订阅服务器端

c# - 如何使用 JSON.NET 反序列化日期(毫秒)?

c# - 如何在Unity中自动结束游戏?

c# - 检查点是否可见时出现 NullreferenceException

c# - 如何在谷歌云平台控制台中启用 'Vector Tile API'?

c# - 在使用 Json.NET 进行序列化时,如何应用重新映射所有属性名称的一般规则?

c# - 适用于 .Net 4.7.2 的 Roslyn

c# - 如何在 Unity 中镜像游戏对象的移动?

c# - 从其他线程调用主线程中的方法