RequireComponent属性如何?

时间:2017-03-27 15:40:10

标签: c# unity3d attributes game-engine

我目前正在使用GDI +在C#中开发基于组件的游戏引擎,并且已经达到某些组件依赖其他组件的程度。

我希望创建一个RequireComponents属性,该属性检查游戏对象是否包含所需的组件(非常类似于统一性)

我之前从未真正创建过自定义属性...很抱歉,如果我听起来很愚蠢,但我不确定如何处理它。

这就是我迄今为止所做的一切哈哈:

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

namespace GameEngine.Components
{
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = false)]
    public class RequireComponent : Attribute
    {
        public RequireComponent(Type type)
        {

        }
    }
}

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

其余的完全取决于您的库,但我认为这几乎就是属性级别所需要的。

只需添加一个字段即可存储所需的类型,以便以后能够使用它。

Type componentType;
public Type ComponentType{
  get{ return componentType; }
}

在构造函数中设置它。

稍后,当您向实体添加组件时......

// Returns whether the component is successfully added
public bool AddComponent(Component c){
  var attribute = 
    c.GetType().
    GetCustomAttributes(typeof(RequireComponent), true).
    FirstOrDefault() as RequireComponent;
  if (attribute != null)
  {
    // Check requirements
    if(!AlreadyHasComponent(requiredAttribute.ComponentType)){
      return false;
    }
  }
  // Requirements met: Add c
  return true;
}

您可能希望将字段改为List<Type>

甚至可以查看Unity的现有ECS库。 有一个特别是我尝试了很多:Entitas