Size: a a a

2021 April 01

S

SG137 in unity3d.ru
источник

К

Костя in unity3d.ru
SG137
кто знает как пофиксить?
Да, думал все будет так просто)
источник

ММ

М М in unity3d.ru
SG137
кто знает как пофиксить?
Чел это не анриал чатик как может показаться на первое апреля)
источник

AS

Anton Smetanin in unity3d.ru
Костя
Есть 3 интерфейса
ISkill
ISkillFire
ISkillFrost

Два класса с наследованием интерфейсов
Fire: ISkill, ISkillFire
Frost: ISkill, ISkillFrost

Список
List<ISkill> SkillsHero

В список SkillsHero я пихаю скилы Fire или Frost.
И вот вопрос, как мне из списка нужные интерфейсы ?

К примеру в одном месте мне нужен интерфейс ISkillFire со своими методами(но не суть про методы,это не важно) и сейчас я пррсто перебираю список фором и пытаюсь привести к нужному мне интерфейсу и вызвать метод, это нормально ?
Может есть какой то метод применимый на список или массив для поиска интерфейса ?

Еще вопрос насколько это затратно по производительности если делать к примеру каждый кадр на 20-50 обьектах где в каждом список с 1-5 скилами ? Не жду ответа в наносекундах но если навскидку сравнить с одним инстейтом то что больше грузит ?
Ну если ты знаешь, что у тебя в герое всегда будут только Fire и Frost, то можно просто сделать два отдельных списка:
List<ISkillFire> FireSkills;
List<ISkillFrost> FrostSkills;
источник

К

Костя in unity3d.ru
Anton Smetanin
Ну если ты знаешь, что у тебя в герое всегда будут только Fire и Frost, то можно просто сделать два отдельных списка:
List<ISkillFire> FireSkills;
List<ISkillFrost> FrostSkills;
Это понятно, пример просто, там интерфейсы вообще IOnShoot , IOnMove и т.д.
источник

К

Костя in unity3d.ru
Костя
Есть 3 интерфейса
ISkill
ISkillFire
ISkillFrost

Два класса с наследованием интерфейсов
Fire: ISkill, ISkillFire
Frost: ISkill, ISkillFrost

Список
List<ISkill> SkillsHero

В список SkillsHero я пихаю скилы Fire или Frost.
И вот вопрос, как мне из списка нужные интерфейсы ?

К примеру в одном месте мне нужен интерфейс ISkillFire со своими методами(но не суть про методы,это не важно) и сейчас я пррсто перебираю список фором и пытаюсь привести к нужному мне интерфейсу и вызвать метод, это нормально ?
Может есть какой то метод применимый на список или массив для поиска интерфейса ?

Еще вопрос насколько это затратно по производительности если делать к примеру каждый кадр на 20-50 обьектах где в каждом список с 1-5 скилами ? Не жду ответа в наносекундах но если навскидку сравнить с одним инстейтом то что больше грузит ?
Мой нейминг тут для примера просто
источник

К

Костя in unity3d.ru
Там не 2 скила а 40+
источник

К

Костя in unity3d.ru
Видов
источник

К

Костя in unity3d.ru
А интерфейсов около 10 будет
источник

AS

Anton Smetanin in unity3d.ru
Костя
Это понятно, пример просто, там интерфейсы вообще IOnShoot , IOnMove и т.д.
Ну просто если интерфейсы у них у всех разные, зачем их к одному базовому приводить и класть в список, если вызов методов всё равно по-разному будет происходить?
источник

AS

Anton Smetanin in unity3d.ru
Можно попробовать сами интерфейсы поменять, чтобы методы одинаковые были. То есть по сути к одному привести
источник

AS

Anton Smetanin in unity3d.ru
Иногда это делается передачей какого-то другого интерфейса в качестве параметра
источник

AS

Anton Smetanin in unity3d.ru
Костя
Это понятно, пример просто, там интерфейсы вообще IOnShoot , IOnMove и т.д.
У тебя судя по названию это вообще делегаты для обработки событий. А они обычно как раз делаются отдельными списками:

public event Action<int> OnShoot;
public event Action<Vector3> OnMove;


Здесь каждое событие — это по сути список, в который ты кладёшь интерфейсы/делегаты через += и удаляешь через -=
источник

AS

Anton Smetanin in unity3d.ru
Ну то есть в твоём случае это должно выглядеть примерно так:

public List<IOnShoot> OnShoot;
public List<IOnMove> OnMove;

А Invoke() будет равносилен
foreach (var handler in OnShoot) {
    handler.Shoot();
}
источник

К

Костя in unity3d.ru
Anton Smetanin
У тебя судя по названию это вообще делегаты для обработки событий. А они обычно как раз делаются отдельными списками:

public event Action<int> OnShoot;
public event Action<Vector3> OnMove;


Здесь каждое событие — это по сути список, в который ты кладёшь интерфейсы/делегаты через += и удаляешь через -=
Скорее всего события нужно
источник

AS

Anton Smetanin in unity3d.ru
Костя
Скорее всего события нужно
Ну это уже детали
источник

AS

Anton Smetanin in unity3d.ru
На интерфейсах у тебя аллокаций не будет при подписке
источник

AS

Anton Smetanin in unity3d.ru
На событиях будут
источник

AS

Anton Smetanin in unity3d.ru
Если очень сильно печёшься о перформансе, то интерфейсы лучше
источник

AS

Anton Smetanin in unity3d.ru
Но концептуально это эквивалентные вещи
источник