Difference between revisions of "FadedProto:Person"

From Bakery GPU Lightmapper: Wiki
Jump to navigation Jump to search
(Готовые кастомизированные поведения)
(Краткая справка по функциям)
 
(6 intermediate revisions by the same user not shown)
Line 93: Line 93:
 
[[File:Navvis.jpg|thumb|Визуализация текущего маршрута NPC]]
 
[[File:Navvis.jpg|thumb|Визуализация текущего маршрута NPC]]
 
Если выделить персонажа во время игры, можно увидеть его текущий маршрут (красная линия - путь, зелёная сфера - точка назначения).
 
Если выделить персонажа во время игры, можно увидеть его текущий маршрут (красная линия - путь, зелёная сфера - точка назначения).
 +
 +
=== Скриптование ===
 +
 +
==== Как создать новое кастомное поведение ====
 +
* Создать новый скрипт и повесить на персонажа.
 +
* Заменить в коде наследование от '''MonoBehaviour''' на наследование от '''customBehaviour'''.
 +
* Объявить функцию <pre>public override IEnumerator customUpdate(Person person)</pre> Тут будет код всех действий NPC в нераздражённом состоянии.
 +
 +
 +
* Объявить функцию <pre>public override void customDialogue(Person person)</pre> Тут будет код диалога с NPC.
 +
 +
 +
 +
* В поле компонента '''Greet''' ввести приветствие/первую фразу, которую игрок может ему сказать.
 +
 +
Пример можно найти в '''CustomNPCExample.cs'''.
 +
 +
==== Краткая справка по функциям ====
 +
* <pre>person.HeadLook(Transform T)</pre>заставить персонажа следить головой за T. Если T==null, перестать следить головой.
 +
<hr>
 +
* <pre>yield return StartCoroutine(person.moveTo(Vector3 P, float D, Person.moveMode M))</pre>
 +
заставить персонажа идти к точке P на дистанцию D. Если M==Person.MoveMode.walk, идёт пешком, если M==Person.MoveMode.run, бежит.
 +
<hr>
 +
* <pre>yield return StartCoroutine(person.lookTo(Vector3 P, float D))</pre>: заставить персонажа повернуться в сторону точки P, чтобы угол совпадал хотя бы на D (от 0 до 1). Обычно D = 0.1.
 +
<hr>
 +
* <pre>yield return StartCoroutine(person.playAnim(string A))</pre>: заставить персонажа начать проигрывать анимацию А. Все доступные анимации можно найти в папке '''Resources/anim</pre>.
 +
<hr>
 +
* <pre>yield return new WaitForSeconds(float T)</pre>: ждать T секунд, прежде чем продолжить дальше.
 +
<hr>
 +
* <pre>person.Talk(string S, string T, float I)</pre>: заставить персонажа сказать фразу. S = название звукового ассета из папки '''Resources''' (может быть null), T = субтитр, I = время показа субтитра на экране.
 +
<hr>
 +
* <pre>ClearPhrases()</pre>: во время диалога - убирает старые варианты ответов.
 +
<hr>
 +
* <pre>SetPhrase(int N, string S, F)</pre>: во время диалога - устанавливает вариант ответа для игрока. N = номер варианта (0-6), S = текст, F = функция, которая запускается при его выборе.
 +
<hr>
 +
* <pre>EndDialogue()</pre>: заканчивает диалог. Можно сувать в качестве F в SetPhrase (без скобок).

Latest revision as of 22:19, 1 February 2020

Person - любой персонаж (игрок или NPC).

Как создать

  • В сцену бросается заскиненная модель человечка. Скелет должен быть одинаковым и совпадать со скелетом из Мафии. Полная библиотека доступных моделей здесь, можете просить выслать любую.
  • На модель вешается компонент Person.
  • Опционально на модель вешается компонент с кастомизацией поведения.

Настройки компонента

  • Voice: префикс файлов озвучки для стандартных фраз. Доступные варианты:
    • sb/ мужской голос 1 (дефолт, будет работать, если оставить строку пустой)
    • ep_ мужской голос 2
    • gs/ мужской голос 3
    • ju/ женский голос
  • Idle Anim: имя дефолтной idle анимации (можно оставить пустым)
  • Walk Anim: имя дефолтной анимации походки (можно оставить пустым)
  • Sex: пол. От него зависят дефолтные анимации и упоминания персонажа другими в фразах.
  • Clothes: какую одежду на этом персонаже видят другие, и какой статус он в итоге на них проецирует. Персонажей запоминают по одежде, и если их ищут, то будут отсеивать в первую очередь по ней. Одежда может влиять на роль NPC. Доступные варианты:
    • civilCoat: любая неприметная одежда пешехода.
    • ggCoat: одежда ГГ.
    • cookSuit: одежда повара.
    • waitressDress: одежда официантки.
    • detectiveSuit: одежда детектива. Детективы имеют особые отличия:
      • Будучи вызваны по телефону на место преступления, внимательно обследуют все помещения и закутки вокруг него
      • Видят гильзы - подбирают их
      • Видят видеокассеты - подбирают их
      • Видят оружие - при любых обстоятельствах подбирают его и запоминают владельца
      • Видят тело - при любых обстоятельствах проверяют его, запоминают и обстоятельства его смерти
      • Видят кровь - при любых обстоятельствах проверяют её, запоминают и узнают, чья она
      • Пробуют говорить со всеми, кого найдут вокруг места преступления
      • Могут выбивать запертые двери
      • После обследования места преступления выносят вердикт, подозреваемых добавляют в розыск
      • Могут за некоторое время опознавать персонажей из розыска и пытаться их арестовывать
    • copSuit: одежда полицейского. Копы имеют особые отличия:
      • Имея в инвентаре рацию, могут передавать всем другим копам свои знания
      • Могут вызывать подкрепление по телефону
      • Будучи вызваны в качестве подкрепления, умеют организовываться, распредяясь по территории
      • Умеют обклеивать места преступлений жёлтой лентой при её наличии в инвентаре
      • Если держат оружие в руке, никто не удивляется
      • Если стоят рядом с трупом, никто не удивляется
      • Могут выбивать запертые двери
      • Могут за некоторое время опознавать персонажей из розыска и пытаться их арестовывать
    • Health: здоровье. Если ниже 50, то персонаж хромает и не может бегать. Если 0, то труп.
    • Height: высота коллайдера персонажа.
    • Energy: энергия для вселения (0-1).
    • Speed: скорость бега.
    • Owner ID: уникальный номер персонажа, которым помечаются его владения в виде секторов (квартира, например). Если персонажи видят в своих владениях других с неправильным ownerID, они считают это преступлением. По умолчанию равно 0 (ничем не владеет).
    • Lock AI: отключить AI.
    • Invisible: сделать персонажа невидимым для других.
    • Deaf: отключить персонажу слух.
    • Blind: отключить персонажу зрение.
    • Hide Warn: отключить влияние персонажа на красную полосу подозрения у игрока.
    • Can Mind Control: можно ли в этого персонажа вселяться.
    • Navigation Smoothness: чем больше это число, тем резче NPC поворачивается при ходьбе (0.005 - плавно, 0.75 - резко).
    • Behaviour: особенности поведения NPC. Доступные варианты:
      • staff: персонал какого-либо заведения. Вызывает ближайшего охранника ко всему подозрительному, что находит.
      • civil: обычный персонаж. Реакция на раздражители рандомизируется, но чаще в сторону пассивной.
      • guard: охранник. Активная реакция на раздражители, проверяет всё подозрительное что видит/слышит. Охранников запоминают остальные и обращаются к ним за помощью.
    • patrolRoute: если охранник потерял нарушителя, он совершает обход по этому пути (см. PatrolRoute).
    • Forgotten Things Place Name: имя думми в сцене, куда охранники относят подозрительные предметы на хранение, и где их затем все игнорят.
    • Auto Lock Doors: автоматически запирать за собой двери после вхождения в них (если есть ключ).
    • Violent: делает персонажа киллером. Киллеры пытаются незаметно следовать за своими целями и нападать на них, когда не видят вокруг свидетелей. Любой персонаж, достаточно раздражающий киллера, добавляется в этот список. На многие факторы реакция совпадает с behaviour = guard.
    • Ignore Tresspass: не обращать внимания на персонажей, лезущих во все запретные для них места (см. Navmesh).
    • Notice Guarded Tresspassers: если ignore tresspass = false, стоит ли обращать внимание на персонажей, лезущих в места с пометкой guarded.
    • Notice Car Alarm: реагировать на звуки сигнализации авто.
    • Can Evacuate: может ли персонаж просить других эвакуироваться из заведения, если нашёл место преступления в нём.
    • React On Phone: должен ли персонаж уметь слышать звонок телефона и отвечать на него.
    • Notice Coins: должен ли персонаж замечать монеты.
    • Always Pickup Weapons: подбирать увиденное оружие при любых обстоятельствах.
    • Dead: является ли персонаж рэгдоллом (необязательно мёртв).
    • Dry Death: если персонаж dead, откинулся ли он без истекания кровью. Влияет на наличие следов крови от тела.
    • Is Sleeping: если персонаж dead, спит ли он на самом деле. Спящий может проснуться.
    • No Fake Call: отключить фейковое вызывание полиции к телу, когда то находится достаточно далеко от игрока.
    • Was Hit Hard: был ли персонаж сильно ударен. Влияет только на восприятие детективом.
    • Was Shot: был ли персонаж застрелен. Влияет только на восприятие детективом.
    • Can Use Clothes: можно ли в этого персонажа переодеться.
    • Inventory: список предметов в инвентаре.
    • Inventory Ammo: список "патронов" в предметах инвентаря. Если неприменимо, ставим 0. Размер списка обязан быть равен размеру inventory.
    • Inventory Parent: используется для совмещения/модификации предметов, можно оставить пустой список нулевого размера.
    • Initial Knowledge Names: имена предметов в сцене, о которых персонаж изначально знает. Пока предметами могут быть двери (знание о их запертости).
    • Initial Known Guards: имена охранников в сцене, о которых персонаж изначально знает (остальных запоминает глазами по мере игры).

Кастомизация поведения

По умолчанию, персонаж будет просто стоять на месте, если его ничем не раздражать. Для придания индивидуальности/роли, ему назначается второй компонент со скриптом поведения.

Готовые кастомизированные поведения

  • IdleGuard: стоит на месте. Если вследствие раздражителей куда-то убежал, то, когда успокоится - возвращается на точку спауна.
  • PatrolGuy: в спокойном режиме циклично патрулирует по указанным точкам. Параметры:
    • Waypoint Names: имена думми объектов в сцене, по которым персонаж патрулирует. Начинает с той, которая к нему ближе. Между вейпоинтами работает поиск пути по навмешу, поэтому не нужно ставить их слишком детально.
    • Dist: на какую дистанцию подойти к каждой точке. Рекомендуется не ставить меньше 2.
    • Wait Secs: сколько секунд подождать у каждой точки.
    • Move Mode: идти или бежать.

Дебаг

Визуализация текущего маршрута NPC

Если выделить персонажа во время игры, можно увидеть его текущий маршрут (красная линия - путь, зелёная сфера - точка назначения).

Скриптование

Как создать новое кастомное поведение

  • Создать новый скрипт и повесить на персонажа.
  • Заменить в коде наследование от MonoBehaviour на наследование от customBehaviour.
  • Объявить функцию
    public override IEnumerator customUpdate(Person person)
    Тут будет код всех действий NPC в нераздражённом состоянии.


  • Объявить функцию
    public override void customDialogue(Person person)
    Тут будет код диалога с NPC.


  • В поле компонента Greet ввести приветствие/первую фразу, которую игрок может ему сказать.

Пример можно найти в CustomNPCExample.cs.

Краткая справка по функциям

  • person.HeadLook(Transform T)
    заставить персонажа следить головой за T. Если T==null, перестать следить головой.

  • yield return StartCoroutine(person.moveTo(Vector3 P, float D, Person.moveMode M))

заставить персонажа идти к точке P на дистанцию D. Если M==Person.MoveMode.walk, идёт пешком, если M==Person.MoveMode.run, бежит.


  • yield return StartCoroutine(person.lookTo(Vector3 P, float D))
    : заставить персонажа повернуться в сторону точки P, чтобы угол совпадал хотя бы на D (от 0 до 1). Обычно D = 0.1.

  • yield return StartCoroutine(person.playAnim(string A))
    : заставить персонажа начать проигрывать анимацию А. Все доступные анимации можно найти в папке Resources/anim.

  • yield return new WaitForSeconds(float T)
    : ждать T секунд, прежде чем продолжить дальше.

  • person.Talk(string S, string T, float I)
    : заставить персонажа сказать фразу. S = название звукового ассета из папки Resources (может быть null), T = субтитр, I = время показа субтитра на экране.

  • ClearPhrases()
    : во время диалога - убирает старые варианты ответов.

  • SetPhrase(int N, string S, F)
    : во время диалога - устанавливает вариант ответа для игрока. N = номер варианта (0-6), S = текст, F = функция, которая запускается при его выборе.

  • EndDialogue()
    : заканчивает диалог. Можно сувать в качестве F в SetPhrase (без скобок).