Эмоциональные шарики и эмоции
Эмоциональный шарик — это небольшой анимированный пузырь, который появляется над головой персонажа: восклицательный знак, когда тренер замечает вас, сердце над вашим последователем, вопросительный знак над озадаченным NPC. MCE поставляется с 14 собственными шариками — оригинальными рисунками, которые есть в каждой игре, — и позволяет игре добавить поверх них свой набор.
Одни и те же шарики обслуживают четыре разных источника вызова:
| Источник | Как он запрашивает шарик |
|---|---|
| Игрок | Горячие клавиши функциональных клавиш (F1–F12, Shift+F1, Shift+F2) |
| Скрипт | Узел PlayEmotion в CommandGraph |
| Последователь | Сердце, пока он рычит на вас (MonsterFollowerController) |
| Другие игроки | В слое MMORPG — шарик над удалённым аватаром: см. Онлайн-эмоции |
Все запрашивают шарик по имени.
14 шариков движка
Имена хранятся в EmotionBalloonNames (пространство имён OpenMon.MCE.Characters.Followers.Talk). EmotionBalloonNames.All перечисляет их в том порядке, в каком их используют горячие клавиши:
| Имя | Горячая клавиша |
|---|---|
exclamation_mark | F1 |
question_mark | F2 |
heart | F3 |
music_note | F4 |
anger | F5 |
sweat_drop | F6 |
sleep | F7 |
happy | F8 |
sad | F9 |
shocked | F10 |
idea | F11 |
ellipsis | F12 |
sparkle | Shift+F1 |
determined | Shift+F2 |
Собственный набор движка — это ScriptableObject по пути Resources/Characters/EmotionBalloons/DefaultEmotionBalloons, поэтому любая игра находит его, ничего не подключая.
Горячие клавиши игрока
PlayerCharacter добавляет себе компонент PlayerEmoteInput сразу, как только начинает получать ввод. С этого момента перечисленные выше клавиши показывают соответствующий шарик над игроком.
Горячая клавиша срабатывает, только когда игрок свободен для действий:
- игрок не взаимодействует (его не удерживает диалог, меню или сцена),
- игра запущена (масштаб времени больше нуля),
- предыдущий шарик закончился — одновременно существует только один шарик.
Каждый раз, когда локальный игрок показывает шарик, вызывается PlayerEmotes.Played с именем шарика. Через это событие онлайн-слой узнаёт, что нужно сообщить остальным игрокам; вы тоже можете на него подписаться:
using OpenMon.MCE.Characters;
PlayerEmotes.Played += name => Debug.Log($"The player showed '{name}'.");
PlayerEmotes.NameForHotkey(functionKey, shift) сопоставляет клавишу имени шарика (для клавиши без шарика возвращает null).
Показ шарика из скрипта
Добавьте в любой граф узел PlayEmotion (Create Command / Animations / PlayEmotion):
| Поле | Значение |
|---|---|
| Emotion | Имя шарика (по умолчанию heart). Имя, которого нет ни у кого, не воспроизводит ничего, даже звука. |
| Target | Персонаж, который его показывает. Пусто: актор, выполняющий граф. |
| On Player | Показать шарик над игроком. |
| Wait | Удерживать граф, пока шарик не исчезнет (включено по умолчанию). Если выключено, граф продолжает работу, пока шарик играет. |
PlayExclamation — более старый «брат» с единственной задачей: он показывает восклицание над персонажем или над игроком, используя собственное восклицание игры, если оно есть в её наборе.
Сердце пос ледователя
Последователь, у которого нет собственной таблицы реплик (игра не импортировала её), показывает над собой сердце движка, пока рычит, когда вы с ним заговариваете. Из кода можно запросить у последователя любой шарик:
// follower is the MonsterFollowerController of the player's follower
StartCoroutine(follower.ShowEmotion(EmotionBalloonNames.Sparkle));
Свои шарики
Игра заменяет или расширяет шарики движка с помощью Emotion Balloon Set (Create > MCE > Characters > Emotion Balloon Set):
| Поле | Значение |
|---|---|
balloons | Шарики: у каждого есть name, его sprites, спрайт, показываемый на каждом обновлении (spriteByUpdate), и высота прыжка на каждом обновлении (heightByUpdate). Временные шкалы идут со скоростью 60 обновлений в секунду; 16 единиц карты составляют один тайл. |
aliases | Другое имя шарика — имя, под которым скрипт знает шарик, называемый в картридже иначе. |
sound | Звук, который издаёт шарик при появлении. Пусто: без звука. |
Назначьте набор в поле Emotion Balloons вашего ассета MCESettings. Когда кто-либо запрашивает шарик, EmotionBalloonSet.Resolve(gameSet, name) ищет в таком порядке:
- собственный набор игры — по имени или псевдониму;
- собственный набор движка (
EmotionBalloonSet.Default).
Поэтому игра, определившая heart, получает своё сердце везде — на горячей клавише, в скрипте, у последователя и в шариках, которые видят другие игроки, — а игра, которая ничего не определяет, всё равно имеет все 14.
Игры, импортированные из картриджа (см. Импортированные игры и профили игр), получают собственный набор, который строит импортёр, а профиль игры назначает его в MCESettings (и возвращает прежнее значение при восстановлении профиля).
Над любым телом
Всплывающий элемент (CharacterPopUpController) рисует шарик над игроком и над каждым актором. Для всего, у чего нет такого элемента, — последователя, аватара другого игрока, вашего собственного объекта — используйте EmotionBubbleOverBody:
StartCoroutine(EmotionBubbleOverBody.Play(someTransform, balloon, clock: null));
Он подвешивает к телу временный объект, помещает его над самым высоким из спрайтов тела, центрирует по всем спрайтам и на каждом обновлении повторяет прыжок шарика. Когда шарик заканчивается, объект исчезает. Шарик, которому нечего рисовать, или тело без спрайтов не делают ничего.
Справочник
| Тип | Пространство имён | Роль |
|---|---|---|
EmotionBalloonNames | OpenMon.MCE.Characters.Followers.Talk | 14 имён и All |
EmotionBalloonSet | OpenMon.MCE.Characters.Followers.Talk | Набор шариков, Default, Resolve, Find |
EmotionBubbleOverBody | OpenMon.MCE.Characters.Followers.Talk | Рисует шарик над любым телом |
PlayerEmotes | OpenMon.MCE.Characters | Сопоставление горячих клавиш и событие Played |
PlayerEmoteInput | OpenMon.MCE.Characters | Читает горячие клавиши |
CharacterPopUpController | OpenMon.MCE.Actors | PlayEmotion(name), PlayBalloon(balloon, sound) |
PlayEmotion | OpenMon.MCE.Actors.CommandGraph.Animations | Узел скрипта |