Difference between revisions of "FadedProto:Person"
Jump to navigation
Jump to search
(→Краткая справка по функциям) |
|||
(11 intermediate revisions by the same user not shown) | |||
Line 18: | Line 18: | ||
** '''civilCoat''': любая неприметная одежда пешехода. | ** '''civilCoat''': любая неприметная одежда пешехода. | ||
** '''ggCoat''': одежда ГГ. | ** '''ggCoat''': одежда ГГ. | ||
− | |||
** '''cookSuit''': одежда повара. | ** '''cookSuit''': одежда повара. | ||
** '''waitressDress''': одежда официантки. | ** '''waitressDress''': одежда официантки. | ||
Line 45: | Line 44: | ||
** '''Energy''': энергия для вселения (0-1). | ** '''Energy''': энергия для вселения (0-1). | ||
** '''Speed''': скорость бега. | ** '''Speed''': скорость бега. | ||
− | ** '''Owner ID''': уникальный номер персонажа, которым помечаются его владения в виде [[FadedProto: | + | ** '''Owner ID''': уникальный номер персонажа, которым помечаются его владения в виде [[FadedProto:Sector|секторов]] (квартира, например). Если персонажи видят в своих владениях других с неправильным ownerID, они считают это преступлением. По умолчанию равно 0 (ничем не владеет). |
** '''Lock AI''': отключить AI. | ** '''Lock AI''': отключить AI. | ||
** '''Invisible''': сделать персонажа невидимым для других. | ** '''Invisible''': сделать персонажа невидимым для других. | ||
Line 86: | Line 85: | ||
* '''IdleGuard''': стоит на месте. Если вследствие раздражителей куда-то убежал, то, когда успокоится - возвращается на точку спауна. | * '''IdleGuard''': стоит на месте. Если вследствие раздражителей куда-то убежал, то, когда успокоится - возвращается на точку спауна. | ||
* '''PatrolGuy''': в спокойном режиме циклично патрулирует по указанным точкам. Параметры: | * '''PatrolGuy''': в спокойном режиме циклично патрулирует по указанным точкам. Параметры: | ||
− | ** '''Waypoint Names''': имена думми объектов в сцене, по которым персонаж патрулирует. Начинает с той, которая к нему ближе. | + | ** '''Waypoint Names''': имена думми объектов в сцене, по которым персонаж патрулирует. Начинает с той, которая к нему ближе. Между вейпоинтами работает поиск пути по [[FadedProto:Navmesh|навмешу]], поэтому не нужно ставить их слишком детально. |
− | ** '''Dist''': на какую дистанцию подойти к каждой точке. | + | ** '''Dist''': на какую дистанцию подойти к каждой точке. Рекомендуется не ставить меньше 2. |
** '''Wait Secs''': сколько секунд подождать у каждой точки. | ** '''Wait Secs''': сколько секунд подождать у каждой точки. | ||
** '''Move Mode''': идти или бежать. | ** '''Move Mode''': идти или бежать. | ||
Line 94: | 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).
Contents
Как создать
- В сцену бросается заскиненная модель человечка. Скелет должен быть одинаковым и совпадать со скелетом из Мафии. Полная библиотека доступных моделей здесь, можете просить выслать любую.
- На модель вешается компонент 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: идти или бежать.
Дебаг
Если выделить персонажа во время игры, можно увидеть его текущий маршрут (красная линия - путь, зелёная сфера - точка назначения).
Скриптование
Как создать новое кастомное поведение
- Создать новый скрипт и повесить на персонажа.
- Заменить в коде наследование от 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 (без скобок).