Итак, я начинаю вводить атаку на нашу двумерную космическую RTS (это в Unity, так что это компонентно управляемый). Первоначально это было так же просто, как «враг в радиусе действия, наносимый урон». Однако будет несколько «типов» оружия / атак, которые связаны с их конкретным кораблем или структурой. А также другие факторы, связанные с прошлым, просто грубый урон, такой как тип урона и, возможно, инерция в будущем.
Ребята, хотите, чтобы у каждого юнита и типа конструкции был свой атакующий тип. То есть вы создаете скрипт для каждого юнита / структуры, который определяет его тип атаки, урон, эффекты, радиус действия, частицы, спрайты ... и т. Д. И присоединяете это как компонент?
Или создайте сценарий, который определяет тип атаки, сценарий для типа снаряда, связанного с этим ... и т. Д. А затем расширьте их и измените их для каждого подразделения, прикрепив каждый сценарий к устройству / структуре.
Надеюсь, у меня есть какой-то смысл, я так долго размышлял над этим, я не уверен, решаю ли я проблему, или просто придумываю свои собственные проблемы и копаю себя в яме.
Если у вас есть игра, которая может иметь множество типов атак, которые могут или не могут быть ограничены определенным модулем / структурой, как вы проектируете структуру, которая связывает это вместе с конкретными модулями / структурами в среде разработки, управляемой компонентами ?
Если это не достаточно ясно, дайте мне знать.
Изменить: отличные ответы, спасибо.
Расширенный вопрос:
Кажется, что ответы могут варьироваться от «каждый объект может иметь свой собственный скрипт атаки» на «иметь типы атак в качестве своих собственных сценариев и назначать их каждому объекту для более многоразового решения». Допустим, у меня «бластерная» атака, она стреляет красным снарядом с определенной скоростью. Его урон, скорость стрельбы и размер снаряда зависят от отряда, стреляющего в него. Что лучше сделать сценарий атаки для этого подразделения, или попытаться изменить «бластерную атаку» в соответствии с назначением каждого подразделения, которое хочет его использовать?
источник
Ответы:
Ну, я, честно говоря, не эксперт в этом, но ... я думаю, это зависит от того, насколько сложными и разнообразными вы считаете атаки станут. Так как это RTS, я предполагаю, что у вас будет около 10-50 различных юнитов или структур с их собственными типами атак.
Вариант 1. Если существует относительно небольшое количество юнитов, которые будут иметь атаки, которые несколько похожи, я просто поместил бы все в один большой скрипт и определил параметры, используемые в инспекторе.
Вариант 2. Если, с другой стороны, вы представляете большое количество типов атак с разным поведением, вы можете разбить все на части, чтобы у каждого юнита и здания был свой уникальный сценарий атаки. Я думаю, что если вы сделаете это, вы можете создать «вспомогательный» сценарий, который определяет часто используемые куски кода, из которых могут извлечь многие отдельные сценарии. Таким образом, вам не придется переписывать все, и вы будете знать, где все это.
Вариант 3: То, что вы, вероятно, не должны делать, это иметь определенные группы юнитов, которые делятся сценариями, это, вероятно, приведет вас в замешательство и станет беспорядком, если код, необходимый для атаки, состоит из 10 различных сценариев.
Здесь я нарисовал вам картину.
источник
"Here, I drew you a picture."
напомнил мне об этомЯ не очень разбираюсь в Unity и давно не занимался разработкой игр, поэтому позвольте мне дать вам общий ответ по программированию на этот вопрос. Я основал свой ответ на знаниях, которые у меня есть о системах сущностных компонентов в целом, где сущность - это число, которое связано с N многими компонентами, компонент содержит только данные, а система работает с наборами компонентов, которые связаны с та же сущность.
Ваше проблемное пространство таково:
Я бы структурировал решение так:
Важно, чтобы точка соприкосновения между атаками и объектами была как можно более тонкой - это обеспечит возможность повторного использования вашего кода и избавит вас от необходимости придумывать дублирующийся код для каждого другого типа объектов, использующих один и тот же тип атаки. , Другими словами, вот некоторый псевдокод JavaScript, чтобы дать вам идею.
Извините, этот ответ немного «водянистый». У меня только полчаса на обеденный перерыв, и сложно что-то придумать, не зная полностью о Unity :(
источник
Когда юнит / структура / оружие атакует, я, вероятно, создаю Атаку (подкласс со всеми вашими забавными деталями), которая берет нападающего и защитника (или защитников). Атака может затем взаимодействовать с целью / защитником (замедление, отравление, урон, изменение состояния), рисовать себя (луч, луч, пуля) и уничтожать себя, когда это будет сделано. Я могу предвидеть некоторые проблемы, такие как множественные ядовитые атаки, поэтому, возможно, ваши цели реализуют интерфейс Damageable, с которым взаимодействует атака, но я думаю, что это работоспособный подход, который можно изменить по модульному принципу и сделать его гибким.
Расширенный ответ
Вот как я подхожу к бластерной атаке с таким подходом . Я позволю другим ответить за себя.
Я хотел бы, чтобы мои подразделения реализовывали интерфейс или класс IAttacker с базовыми характеристиками / методами атаки. Когда IAttacker атакует IDamageable, он создает свою конкретную Атаку, передавая себя и свою цель (IAttacker и IDamageable, или, возможно, набор IDamageables). Атака получает необходимую ей статистику от IAttacker (чтобы избежать изменений во время обновлений или чего-либо подобного - мы не хотим, чтобы атака изменяла свою статистику после того, как она уже была запущена), и если ей нужны специализированные характеристики, она бросает IAttacker в его необходимый тип (например, IBlasterAttacker) и таким образом получает специализированную статистику.
В соответствии с этим подходом BlasterAttacker просто необходимо создать BlasterAttack, а BlasterAttack позаботится обо всем остальном. Вы можете создать подкласс BlasterAttack или создать отдельный FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker и т. Д., И код атаки для каждого из них одинаков (и, возможно, унаследован от BlasterAttack): создайте BlasterAttack и передайте себя и моих целей в руки. ,
источник