Ищите некоторое представление о разработке программ для атак и типов атак в игре


14

Итак, я начинаю вводить атаку на нашу двумерную космическую RTS (это в Unity, так что это компонентно управляемый). Первоначально это было так же просто, как «враг в радиусе действия, наносимый урон». Однако будет несколько «типов» оружия / атак, которые связаны с их конкретным кораблем или структурой. А также другие факторы, связанные с прошлым, просто грубый урон, такой как тип урона и, возможно, инерция в будущем.

Ребята, хотите, чтобы у каждого юнита и типа конструкции был свой атакующий тип. То есть вы создаете скрипт для каждого юнита / структуры, который определяет его тип атаки, урон, эффекты, радиус действия, частицы, спрайты ... и т. Д. И присоединяете это как компонент?

Или создайте сценарий, который определяет тип атаки, сценарий для типа снаряда, связанного с этим ... и т. Д. А затем расширьте их и измените их для каждого подразделения, прикрепив каждый сценарий к устройству / структуре.


Надеюсь, у меня есть какой-то смысл, я так долго размышлял над этим, я не уверен, решаю ли я проблему, или просто придумываю свои собственные проблемы и копаю себя в яме.

Если у вас есть игра, которая может иметь множество типов атак, которые могут или не могут быть ограничены определенным модулем / структурой, как вы проектируете структуру, которая связывает это вместе с конкретными модулями / структурами в среде разработки, управляемой компонентами ?

Если это не достаточно ясно, дайте мне знать.

Изменить: отличные ответы, спасибо.

Расширенный вопрос:

Кажется, что ответы могут варьироваться от «каждый объект может иметь свой собственный скрипт атаки» на «иметь типы атак в качестве своих собственных сценариев и назначать их каждому объекту для более многоразового решения». Допустим, у меня «бластерная» атака, она стреляет красным снарядом с определенной скоростью. Его урон, скорость стрельбы и размер снаряда зависят от отряда, стреляющего в него. Что лучше сделать сценарий атаки для этого подразделения, или попытаться изменить «бластерную атаку» в соответствии с назначением каждого подразделения, которое хочет его использовать?


1
Для общих идей по программированию игр я бы хотел обратиться к полной спецификации RPG FFV - gamefaqs.com/snes/588331-final-fantasy-v/faqs/30040
Code Whisperer

Ответы:


12

Ну, я, честно говоря, не эксперт в этом, но ... я думаю, это зависит от того, насколько сложными и разнообразными вы считаете атаки станут. Так как это RTS, я предполагаю, что у вас будет около 10-50 различных юнитов или структур с их собственными типами атак.

Вариант 1. Если существует относительно небольшое количество юнитов, которые будут иметь атаки, которые несколько похожи, я просто поместил бы все в один большой скрипт и определил параметры, используемые в инспекторе.

Вариант 2. Если, с другой стороны, вы представляете большое количество типов атак с разным поведением, вы можете разбить все на части, чтобы у каждого юнита и здания был свой уникальный сценарий атаки. Я думаю, что если вы сделаете это, вы можете создать «вспомогательный» сценарий, который определяет часто используемые куски кода, из которых могут извлечь многие отдельные сценарии. Таким образом, вам не придется переписывать все, и вы будете знать, где все это.

Вариант 3: То, что вы, вероятно, не должны делать, это иметь определенные группы юнитов, которые делятся сценариями, это, вероятно, приведет вас в замешательство и станет беспорядком, если код, необходимый для атаки, состоит из 10 различных сценариев.

Здесь я нарисовал вам картину.

введите описание изображения здесь


2
Большое спасибо за ответ. По какой-то причине я начал склоняться к варианту 3, и мне было трудно найти способ его оправдать. Я, вероятно, пойду по второму пути, каждый юнит получает свой собственный скрипт атаки с общим кодом, который разделяют, используя общий код как компонент каждого юнита / здания. Я не уверен, куда я шел с ходом мыслей, который привел меня к варианту 3, спасибо. Я оставляю это открытым до тех пор, пока не встану в АМ на случай, если появятся другие постеры, которые хотят присоединиться.
Дуглас Гаскелл

Нет проблем, это не окончательный ответ, но надеюсь, что это поможет.
Мир

1
Вы можете гибридизовался 1 и 2, поставив аналогичные атаки в один большой скрипт и выделить неодинаковую атаки
трещотки урод

4
Я удивлен, № 3 рекомендуется против? Разве не весь смысл модульных / универсальных классов, так что каждый модуль не должен определять свой собственный тип? Если игра представляет собой RTS, а урон осады (обычно «большой дистанции») является типом урона, вы можете определить его один раз и использовать несколько юнитов в стиле артиллерии при выполнении своих расчетов урона, так что если урон от осады когда-нибудь нужно быть нерфированным (перебалансированным), вам нужно будет обновить только один класс?
HC_

1
"Here, I drew you a picture."напомнил мне об этом
FreeAsInBeer

4

Я не очень разбираюсь в Unity и давно не занимался разработкой игр, поэтому позвольте мне дать вам общий ответ по программированию на этот вопрос. Я основал свой ответ на знаниях, которые у меня есть о системах сущностных компонентов в целом, где сущность - это число, которое связано с N многими компонентами, компонент содержит только данные, а система работает с наборами компонентов, которые связаны с та же сущность.

Ваше проблемное пространство таково:

  • Есть несколько способов атаковать врага в игре в целом.
  • Каждый корабль, структура и т. Д. Могут иметь несколько способов атаки (каждый определяется тем или иным способом)
  • Каждая атака может иметь свои собственные эффекты частиц.
  • Атака должна учитывать некоторые факторы (например, инерцию или броню), которые присутствуют на цели и на пользователе.

Я бы структурировал решение так:

  • У атаки есть идентификатор - это может быть строка.
  • Сущность «знает», что она может использовать атаку (на основе идентификатора атаки).
  • Когда объект использует атаку, соответствующий компонент дисплея добавляется к сцене.
  • У вас есть некоторая логика, которая знает о цели атаки, атакующем и используемой атаке - эта логика должна решить, какой урон вы наносите (и иметь доступ к инерции или любому другому объекту).

Важно, чтобы точка соприкосновения между атаками и объектами была как можно более тонкой - это обеспечит возможность повторного использования вашего кода и избавит вас от необходимости придумывать дублирующийся код для каждого другого типа объектов, использующих один и тот же тип атаки. , Другими словами, вот некоторый псевдокод JavaScript, чтобы дать вам идею.

// components
var bulletStrength = { strength: 50 };
var inertia = { inertia: 100 };
var target = { entityId: 0 };
var bullets = {};
var entity = entityManager.create([bulletStrength, inertia, target, bullets]);

var bulletSystem = function() {
  this.update = function(deltaTime, entityId) {
    var bulletStrength = this.getComponentForEntity('bulletStrength', entityId);
    var targetComponent = this.getComponentForEntity('target', entityId);
    // you may instead elect to have the target object contain properties for the target, rather than expose the entity id
    var target = this.getComponentForEntity('inertia', targetComponent.entityId);

    // do some calculations based on the target and the bullet strength to determine what damage to deal
    target.health -= ....;
  }
};

register(bulletSystem).for(entities.with(['bullets']));

Извините, этот ответ немного «водянистый». У меня только полчаса на обеденный перерыв, и сложно что-то придумать, не зная полностью о Unity :(


3

Когда юнит / структура / оружие атакует, я, вероятно, создаю Атаку (подкласс со всеми вашими забавными деталями), которая берет нападающего и защитника (или защитников). Атака может затем взаимодействовать с целью / защитником (замедление, отравление, урон, изменение состояния), рисовать себя (луч, луч, пуля) и уничтожать себя, когда это будет сделано. Я могу предвидеть некоторые проблемы, такие как множественные ядовитые атаки, поэтому, возможно, ваши цели реализуют интерфейс Damageable, с которым взаимодействует атака, но я думаю, что это работоспособный подход, который можно изменить по модульному принципу и сделать его гибким.

Расширенный ответ
Вот как я подхожу к бластерной атаке с таким подходом . Я позволю другим ответить за себя.

Я хотел бы, чтобы мои подразделения реализовывали интерфейс или класс IAttacker с базовыми характеристиками / методами атаки. Когда IAttacker атакует IDamageable, он создает свою конкретную Атаку, передавая себя и свою цель (IAttacker и IDamageable, или, возможно, набор IDamageables). Атака получает необходимую ей статистику от IAttacker (чтобы избежать изменений во время обновлений или чего-либо подобного - мы не хотим, чтобы атака изменяла свою статистику после того, как она уже была запущена), и если ей нужны специализированные характеристики, она бросает IAttacker в его необходимый тип (например, IBlasterAttacker) и таким образом получает специализированную статистику.

В соответствии с этим подходом BlasterAttacker просто необходимо создать BlasterAttack, а BlasterAttack позаботится обо всем остальном. Вы можете создать подкласс BlasterAttack или создать отдельный FastBlasterAttacker, MegaBlasterAttacker, SniperBlasterAttacker и т. Д., И код атаки для каждого из них одинаков (и, возможно, унаследован от BlasterAttack): создайте BlasterAttack и передайте себя и моих целей в руки. ,


По сути, юнит унаследован от интерфейса IAttacker (у меня это уже есть), и есть интерфейс IDamageable для «врага» (имейте это также). Когда атакующий атакует, вызывается BlasterAttack (или производный класс). Эта «атака» извлечет необходимые данные из IAttacker и применит их к IDamageable, когда снаряд попадет? Содержит ли сам снаряд класс BlasterAttack, чтобы после его выстрела на него больше не влияли изменения в IAttacker, и он может применять свой урон / эффекты к IDamageable, только если он действительно поражает снаряд.
Дуглас Гаскелл

Когда вы говорите «BlasterAttack (или производный класс) называется», я бы сказал, что BlasterAttack создан. Этот недавно созданный экземпляр BlasterAttack представляет луч (или пулю, или луч, или что-то еще), так что это снаряд. BlasterAttack копирует любую необходимую ему статистику из объектов IAttacker и IDamageable: позиции, статистику атакующего и т. Д. Затем BlasterAttack отслеживает свою собственную позицию и, если применимо, наносит урон по «контакту». Вам нужно будет выяснить, что делать, если он пропустит или достигнет пункта назначения (старая позиция цели). Сжечь землю? Исчезают? Ваш звонок.
Риксм

Для Атаки по области действия вам может потребоваться доступ к глобальной коллекции (вражеских) юнитов, поскольку тот, кто находится в радиусе действия, а кто вне его, может меняться между огнем и ударом. Конечно, аналогичный аргумент может быть приведен и для BlasterAttack: вы пропустили свою начальную цель, но попали в парня позади него. Единственное, что меня беспокоит, - это то, что у вас может быть много атак, повторяющихся среди множества врагов, пытающихся выяснить, ударили ли они и чем. Это проблема производительности.
Риксм

Ах, это имеет смысл. Для пропущенной атаки у снаряда будет свой заранее заданный диапазон / время жизни. Если он столкнется с чем-то еще до конца этого срока, он получит ссылку на любой объект, которому принадлежит твердое тело, с которым он сталкивается, и таким образом будет нанесен ущерб. На самом деле, именно так будут работать все снаряды, они не знают, «к чему» они летят, только то, что они путешествуют (исключая самонаводящиеся снаряды, такие как ракеты). Эффекты УЭО могут просто активировать сферический коллайдер по назначению и получить все объекты внутри него. Спасибо за помощь.
Дуглас Гаскелл

Нет проблем. Рад, что мог. Забыл, что Unity облегчает все эти столкновения.
Риксм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.