Я хочу создать небольшой пример Entity-Component-System и создать несколько компонентов, таких как
internal struct Position : IComponent
{
public int X { get; set; }
public int Y { get; set; }
}
и
internal struct MovementSpeed : IComponent
{
public int Value { get; set; }
}
Каждый компонент реализует пустой интерфейс IComponent
.Когда система циклически перебирает сущности, я хотел бы быстро найти соответствующие компоненты.
Я думал о создании словаря, в котором тип компонента будет содержать ключ, а компонент текущей сущности - значение.
Я начал с public Dictionary<Type, IComponent> Components { get; }
Я могу добавить компоненты, используя myEntity.Components.Add(typeof(Movement), new Movement() as IComponent);
, но как я могу вернуть компонент?Я создал пример системы движений
internal class Movement : ISystem
{
public void Update()
{
foreach (Entity entity in EntityPool.activeEntities.Values) // Loop through all entities
{
Dictionary<Type, IComponent> components = entity.Components;
if (components.TryGetValue(typeof(Position), out Position positionComponent))
{
if (components.TryGetValue(typeof(MovementSpeed), out MovementSpeed movementSpeedComponent))
{
// TEST: move (1 * movementspeed) units
positionComponent.X += movementSpeedComponent.Value;
positionComponent.Y += movementSpeedComponent.Value;
}
}
}
}
}
if (components.TryGetValue(typeof(Position), out Position positionComponent))
падает, потому что значение словаря не возвращает компонент нужного типа, а возвращает интерфейс.
Как я могузаставить это работать?
(Да, я знаю, что мог бы использовать структуру ECS, но я хотел бы сделать это самостоятельно в учебных целях)