StarCraft 2: Создание аркадной системы движения

» Раздел: 1. Основы

Это - относительно простая статья по созданию движения на WASD. Предполагается, что Вы знаете, как использовать редактор триггеров и некоторые основы использования Редактора.
Нам нужен юнит, чтобы им управлять, и для этого мы создаём Архонта. В то время как большая часть статьи применима ко всем юнитам, когда мы доберемся до атаки, мы будем использовать атаку Архонта для контактных повреждений, а у других войск нет этого.
Так, Создайте Архонта для Игрока 1 в центре карты. Кроме того, создайте круглую область с радиусом 0.25 под названием CameraView

А теперь перейдём к триггерам

Итак, мы получили нашего Архонта и нашу маленькую область, теперь можно и покодить. Откройте редактор триггеров (F6) и удалите инициализацию стандартного режима сражения. После этого надо создать глобальную переменную типа "юнит" под названием "player", для этого выделите область с триггерами и нажмите (ctrl+b). Кроме того для удобства можно создать папку "init", в которой мы расположим триггеры инициализации.
Создаём новый триггер под названием "Init3ps"
В нём мы создаём следующие действия:
Init3ps
    Events
        Game - Map initialization
    Local Variables
    Conditions
    Actions
        Camera - Lock Camera Mouse Relative Mode On/Off(1, On)
        Camera - Turn Camera Mouse Rotation On/Off(1, On)
        Camera - Set the camera bounds for (Player group(1)) to CameraView (Do Not adjust the minimap)
        Camera - Follow for player 1 (Unit group(Player)) with the camera and Clear Current Target
        Region - Attach CameraView to Player with offset (Point(0.0, 0.0))
и запускаем карту. Вы можете вращать камеру вокруг архонта как вам захочется одной мышкой и ни на что не нажимая!

Триггеры управления

Теперь можно и позабавиться с движением. Создаём 2 папки по названиями "Update" и "Movement". В "Update" создаём новый триггер под названием "UpdateCamera".Этот триггер будет держать границы камеры правильными, в то время как мы перемещаем нашего архонта, так как границы камеры не будут следовать за движущейся областью по неизвестным причинам. Да, это похоже на ошибку, поэтому я поместил триггер отдельно, чтобы в случае чего быстро и безболезненно удалить его.
UpdateCamera
    Events
        Timer - Every 0.0001 seconds of Game Time
    Local Variables
    Conditions
    Actions
        Camera - Set the camera bounds for (Player group(1)) to CameraView (Do Not adjust the minimap)
Теперь создаём триггеры движения. В папке "movement" создаём триггер"MoveForwardKeyDown". Эта функция будет реагировать на нажатие клавиши "W" передвижением юнита вперёд. Собственно, это самое основное в коде, ведь движение на wasd в warcraft было неосуществимо! Чтобы всё работало как надо, удостоверьтесь, что используете именно функцию "IssueOrderTargetingPoint".
    Events
        UI - Player 1 presses W key Down with shift Allow, control Allow, alt Allow
    Local Variables
    Conditions
    Actions
        General - While (Conditions) are true, do (Actions)
            Conditions
                ((Current trigger) is on) == true
            Actions
                Unit - Order Player to ( Move targeting ((Position of Player) offset by 1.0 towards (Camera Yaw of Player(1)) degrees)) (Replace Existing Orders)
                General - Wait 0.015 Game Time seconds
Но мы должны прерывать цикл, когда мы отпускаем кнопку "W", поэтому создайте новый триггер под названием "MoveForwardKeyUp". Этот довольно просто.
MoveForwardKeyUp
    Events
        UI - Player 1 presses W key Up with shift Allow, control Allow, alt Allow
    Local Variables
    Conditions
    Actions
        Trigger - Stop all instances of MoveForwardKeyDown
Создание движения это круто, теперь то мы повоюем!
Действительно, таким образом мы сделали движение и обзор, позволяющие создавать свои уникальные системы атаки. Архонт мчится убивать! Гм. Постойте.
Так или иначе, но всё завязано на редакторе ландшафта, поэтому мы вынуждены открыть его снова. Там мы создаём несколько зерлингов для второго игрока, чтобы было кого бить. Также нам понадобится круглая область с радиусом 5 под названием "ArchonAttackRange". После этого надо вернуться в редактор триггеров и создать новую папку под названием "Attack". Здесь мы зададим нашему архону дальность атаки, чтобы архон мог атаковать любого врага в пределах досягаемости, но не дальше.
Так, первый триггер, который мы здесь сделаем будет прикреплять радиус атаки к архонту. В папке "Attack" создайте новый триггер под названием "AttachRadiusToPlayer".
AttachRadiusToPlayer
    Events
        Game - Map initialization
    Local Variables
    Conditions
    Actions
        Region - Attach ArchonAttackRadius to Player with offset (Point(0.0, 0.0))
Затем создайте новый триггер под названием "Attack". Этот триггер будет задействован в довольно таки многих вещах и нам будет проще использовать локальные переменные (они делает вещи легче в конечном счете).
Так, первая часть проста, создаём событие когда игрок нажимает мышь 1.
Так же надо создать новую переменную. Нажмите Ctrl + B и создайте переменную типа "группа юнитов" под названием "TargetGroup".
   TargetGroup = (Units in ArchonAttackRadius having alliance Enemy with player 1 matching Excluded: Missile, Dead, Hidden, with at most Any Amount) <Unit Group>
Теперь все юниты единицы в той области, которую мы приложили к нашему Архонту будут попадать в эту переменную. Любую цель в этой группе сможет атаковать архон, надо только создать юнит- переменную "target". Очень важно создавать переменную группы раньше цели.
        Target = (Closest unit to (Position of Player) in TargetGroup) <Unit>
Теперь, когда у нас есть наши цели, с ними можно что-нибудь сделать. Играем анимацию атаки и если есть зерлинги в радиусе атаки, то они будут получать урон.
    Actions
        Animation - Play Attack animation for (Actor for Player) as Default, using No Options options and Default Time blend time
        General - If (Conditions) then do (Actions) else do (Actions)
            If
                (Number of Living units in TargetGroup) > 0
            Then
                Environment - Create Archon - Archon Damage on Target from Player
            Else
Собственно так будет выглядеть весь триггер атаки:
Attack
    Events
        UI - Player 1 clicks Left mouse button Down.
    Local Variables
        TargetGroup = (Units in ArchonAttackRadius having alliance Enemy with player 1 matching Excluded: Missile, Dead, Hidden, with at most Any Amount) <Unit Group>
        Target = (Closest unit to (Position of Player) in TargetGroup) <Unit>
    Conditions
    Actions
        Animation - Play Attack animation for (Actor for Player) as Default, using No Options options and Default Time blend time
        General - If (Conditions) then do (Actions) else do (Actions)
            If
                (Number of Living units in TargetGroup) > 0
            Then
                Environment - Create Archon - Archon Damage on Target from Player
            Else
Запускаем карту и, о чудо, оно работает!
Это именно то, чему Вас обучила эта статья. Вы можете заметить, что Архонт будет автоматически атаковать зерлингов. Только войдите в Редактора Данных и удалите, способность "Attack", так как мы наносим урон самостоятельно самостоятельно. Удостоверьтесь, что Вы не удаляете неспособность "Move"? она нам нужна.
Спасибо за Чтение.
Скриншоты не были добавлены ввиду бессмысленности- в статье всё написано в блоках кода

Просмотров: 8 836

Ninbous #1 - 9 лет назад 0
Карта имеет неизвесый формат...
Nighty #2 - 9 лет назад 2
вот объясните мне что такое "3Д система движения". Может быть подразумевается "Аркадная система движения"?
Toadcop #3 - 9 лет назад 0
они про камеру я так думаю -.- движение уг само по себе. и аттака тоже.
Clamp #4 - 9 лет назад 0
Так, нашёл оптимизацию, щя будет хотфикс
без дёрганья и с движением назад без поворота...
Уже как бы даже не перевод, а исследование)
я подумал и решил не делать никаких хотфиксов...
ScorpioT1000 #5 - 9 лет назад 0
Timer - Every 0.0001 seconds of Game Time
это беда. камера так и дергается?
ну вобщем мы с Артте изучали полдня, так ничего и не вышло ...
DENj #6 - 9 лет назад 0
Даже если поставить Every 0.0001, периодичность всеравно будет приблизительно 0.1, я проверял.
Вернее 0.05
agentex #7 - 9 лет назад 0
DENj и как же ты проверял? по моим сведеньям минимум это 0.001
DENj #8 - 9 лет назад 0
создал тригер с периодичностью 0.01, создал переменную типа ''real' которая увеличиваеться на 0.01 в этом тригере и написал чтоб эта переменная выводилась на экране (получился самодельный таймер).
А дальше запустил игру и даже без секундомера было видно что периодичность не 0.01
Короче, agentex, сам можеш проверить, сделай такой же тригер запусти игру засеки время и ты увидиш что через 60 сек. переменная будет значительно меньше 60-ти.
Мумка #9 - 9 лет назад 0
Управление полное УГ. Двигатсья можно только вперед, с атакой вообще неразбериха. Могу выложит ьсвои триггеры по поводу движения - получилось отлично. Герой двигается во всех направлениях, при этмо проигрывается анимация движения, т.е. все "кашернинько")))))
Kolbosa #10 - 9 лет назад 0
Короч чтоб камера не дергалась удалите триггер UpdateCamera и удалите действие в первом триггере отвечающее за установки граней камеры, тогда камера перестанет дергатся, но будет немного пьяная))))
reklats #11 - 8 лет назад 0
Мумка, выложи.
Амбидекстрия #12 - 8 лет назад 0
с названием неразбериха. я думаю имелось ввиду 3d person movement system или TPS - система движения от третьего лица, 3д тут вообще не причём
3d person - third person
Hares #13 - 7 лет назад (отредактировано ) 0
Амбидекстрия:
с названием неразбериха. я думаю имелось ввиду 3d person movement system или TPS - система движения от третьего лица, 3д тут вообще не причём
3d person - third person
3rd person
Статью переименовал.
DENj, agentex, 0.0625
DENISishe #14 - 6 лет назад -1
неплохо но у меня он пишет
при первом запуске( камера ) выдаёт синтаксическую ошибку на 29 строке
перевёл на англ язык теперь всё гораздо легче отдельно пишу каждый триггер (нажимаю ctr+t вместо ctr+alt+t)
и почему нету движения назад вправо и влево
не работает
когда я жму клавишу w он мне пишет ошибку тригира (выполнение заняло слишком много времени)