基于组件的设计(C#游戏引擎)

时间:2017-03-06 23:51:20

标签: c# unity3d game-engine component-based

我目前正在使用GDI +在c#中设计2D游戏引擎,而且我的代码中遇到了一个可怕的设计缺陷。

我的想法是我的游戏引擎由多个屏幕组成,每个屏幕包含多个游戏对象,每个游戏对象包含多个组件(就像团结一样)。与前一个游戏对象相比,每个游戏对象可以包含不同的组件。

例如,假设我有一个反弹的球。我需要一个物理组件和一个转换组件。

但是,我已经意识到某些组件依赖其他组件来工作。

在我上面提到的物理组件的情况下,需要访问变换组件来更新并知道球的位置,旋转等。

所以目前,我的基础组件类还包含对当前附加的GameObject的引用,以便任何组件都可以访问游戏对象中的任何其他组件。

我只是想知道这是否是基于组件的引擎的最佳方法。

以下是Sprite Component的脚本,需要访问游戏对象的位置。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GameEngine.Components
{
    /// <summary>
    /// 
    /// </summary>
    /// <seealso cref="GameEngine.Components.Component" />
    /// <seealso cref="System.IDisposable" />
    public class Sprite : Component, IDisposable
    {
        /// <summary>
        /// The bitmap the graphics engine renders
        /// </summary>
        private Bitmap bitmap;

        /// <summary>
        /// Initializes a new instance of the <see cref="Sprite"/> class.
        /// </summary>
        /// <param name="bitmap">The bitmap.</param>
        public Sprite(Bitmap bitmap)
        {
            this.bitmap = bitmap;

            this.Events.OnRenderFrame += Events_OnRenderFrame;
        }

        /// <summary>
        /// Handles the OnRenderFrame event of the Events control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="RenderEventArgs"/> instance containing the event data.</param>
        private void Events_OnRenderFrame(object sender, RenderEventArgs e)
        {
            // Uses the game objects transform component, to get the position of the object
            e.GraphicsEngine.DrawSprite(this, GameObject.GetComponentOfType<Transform>().Position);
        }

        /// <summary>
        /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources.
        /// </summary>
        public void Dispose()
        {
            bitmap.Dispose();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

  

但是,我意识到某些组件依赖于其他组件   工作。

     

在我上面提到的物理组件的情况下,需要访问   变换组件更新并知道球的位置,   轮换等。

是的,但这不是问题。这是一个不能消除的要求,因为有时候两个或多个组成部分一起工作以实现目标。但是,通过在代码中添加通常在Unity中使用的Require Component attribute的依赖组件,可以使其更加明智。

你应该记住,除了基于这个组件的模型的几个优点之外,完全独立是无法实现的。

  

组件应适合部署到任何合适的组件中   环境,因此它们应该拥有与之相关的最小依赖性   其他组件[它们应该是,但在各种情况下都不可能,例如在你的情况下或统一游戏 - 工程] 。这确保了特定的部署   组件不会以任何方式影响整个系统。(more

注意:您有权不同意答案或提供更加确定decoupling的答案。