Ниже приведена простая реализация игрушечного объекта ECS. Сигнатура метода DerefData(GameBehavior) требует использования параметра GameBehavior для поиска по индексу.
Значение GameBehavior должно быть установлено. по типу,Flyable.BehaviorID. Но чтобы это знать, нам нужен экземпляр, который не работает, поскольку цель метода deref — получить экземпляр из универсального типа.
Желательно не использовать Reflection как чтобы быть как можно более быстрым.
Можно ли провести рефакторинг, чтобы использовать только BaseGameObject DerefData() без параметров?
using System;
GameObject gameobj = new();
Flyable fdata = new Flyable { Velocity = 0d };
gameobj.AddBehavior(fdata);
var flightdata = gameobj.DerefData(GameBehavior.Flyable);
// i'd like to remove the parameter from this method signature.
// Which means we need access to IBehavior.BehaviorID,
// which is a 'type-level' property that in theory shouldn't need an object to lookup the value.
interface IBehavior
{
GameBehavior BehaviorID { get; }
}
struct Flyable : IBehavior
{
public GameBehavior BehaviorID => GameBehavior.Flyable;
public double Velocity;
}
[Flags]
enum GameBehavior : int
{
Flyable,
Burnable
}
class GameObject : BaseGameObject{}
abstract class BaseGameObject where T : IBehavior
{
T[] Items = new T[32]; // Max number of enum flags; this ECS is limited to at max 32 behaviors per game object
public U DerefData(GameBehavior behavior) where U : T
{
return (U)Items[(int)behavior]; // We don't have an object instance to lookup behavior ID
}
public void AddBehavior(U obj) where U : T
{
Items[(int)obj.BehaviorID] = obj; // we have an object instance to lookup BehaviorID
}
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... ementation
Как удалить эту косвенность из моей игрушечной реализации ECS ⇐ C#
Место общения программистов C#
-
Anonymous
1715306369
Anonymous
Ниже приведена простая реализация игрушечного объекта ECS. Сигнатура метода DerefData(GameBehavior) требует использования параметра GameBehavior для поиска по индексу.
Значение GameBehavior должно быть установлено. по типу,Flyable.BehaviorID. Но чтобы это знать, нам нужен экземпляр, который не работает, поскольку цель метода deref — получить экземпляр из универсального типа.
Желательно не использовать Reflection как чтобы быть как можно более быстрым.
Можно ли провести рефакторинг, чтобы использовать только BaseGameObject DerefData() без параметров?
using System;
GameObject gameobj = new();
Flyable fdata = new Flyable { Velocity = 0d };
gameobj.AddBehavior(fdata);
var flightdata = gameobj.DerefData(GameBehavior.Flyable);
// i'd like to remove the parameter from this method signature.
// Which means we need access to IBehavior.BehaviorID,
// which is a 'type-level' property that in theory shouldn't need an object to lookup the value.
interface IBehavior
{
GameBehavior BehaviorID { get; }
}
struct Flyable : IBehavior
{
public GameBehavior BehaviorID => GameBehavior.Flyable;
public double Velocity;
}
[Flags]
enum GameBehavior : int
{
Flyable,
Burnable
}
class GameObject : BaseGameObject{}
abstract class BaseGameObject where T : IBehavior
{
T[] Items = new T[32]; // Max number of enum flags; this ECS is limited to at max 32 behaviors per game object
public U DerefData(GameBehavior behavior) where U : T
{
return (U)Items[(int)behavior]; // We don't have an object instance to lookup behavior ID
}
public void AddBehavior(U obj) where U : T
{
Items[(int)obj.BehaviorID] = obj; // we have an object instance to lookup BehaviorID
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78457664/how-to-remove-this-indirection-from-my-toy-ecs-implementation[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия