我目前正在开发一个实体组件系统变体,其中实体知道他们的组件。通常你访问这样的组件:
var camera = myEntity.Get<Camera>();
这样做的问题是,我希望某些对象始终具有某些组件并以类型和 null 安全的方式访问它们。而不是这样做:
if( !myEntity.Has<Camera>() )
myEntity.Add<Camera>();
var camera = myEntity.Get<Camera>();
我宁愿使用:
var entity = World.CreateEntityWith<Camera,Position,...>();
var camera = entity.Camera;
var position = entity.Position;
我能想到的唯一方法是使用接口并实现如下:
public interface ICameraHoldingEntity
{
Camera Camera { get; }
}
public interface IPositionHoldingEntity
{
Position Position { get; }
}
public class CameraEntity
: Entity, ICameraHoldingEntity, IPositionHoldingEntity
{
public World World { get; }
public CameraEntity( World world )
{
World = world;
Add<Camera>();
Add<Position>();
}
public Camera Camera => Get<Camera>()!;
public Position Position => Get<Position>()!;
}
这显然有一些缺点。如果有人删除了这个组件怎么办?如果添加第二个呢?
你能想出一种更聪明的方式或模式来实现我想要做的事情吗?而不是通过组合而不是通过继承?
感谢您阅读:)