Перейти к основному содержимому

Эмоциональные шарики и эмоции

Эмоциональный шарик — это небольшой анимированный пузырь, который появляется над головой персонажа: восклицательный знак, когда тренер замечает вас, сердце над вашим последователем, вопросительный знак над озадаченным NPC. MCE поставляется с 14 собственными шариками — оригинальными рисунками, которые есть в каждой игре, — и позволяет игре добавить поверх них свой набор.

Одни и те же шарики обслуживают четыре разных источника вызова:

ИсточникКак он запрашивает шарик
ИгрокГорячие клавиши функциональных клавиш (F1–F12, Shift+F1, Shift+F2)
СкриптУзел PlayEmotion в CommandGraph
ПоследовательСердце, пока он рычит на вас (MonsterFollowerController)
Другие игрокиВ слое MMORPG — шарик над удалённым аватаром: см. Онлайн-эмоции

Все запрашивают шарик по имени.

14 шариков движка​

Имена хранятся в EmotionBalloonNames (пространство имён OpenMon.MCE.Characters.Followers.Talk). EmotionBalloonNames.All перечисляет их в том порядке, в каком их используют горячие клавиши:

ИмяГорячая клавиша
exclamation_markF1
question_markF2
heartF3
music_noteF4
angerF5
sweat_dropF6
sleepF7
happyF8
sadF9
shockedF10
ideaF11
ellipsisF12
sparkleShift+F1
determinedShift+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) ищет в таком порядке:

  1. собственный набор игры — по имени или псевдониму;
  2. собственный набор движка (EmotionBalloonSet.Default).

Поэтому игра, определившая heart, получает своё сердце везде — на горячей клавише, в скрипте, у последователя и в шариках, которые видят другие игроки, — а игра, которая ничего не определяет, всё равно имеет все 14.

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

Над любым телом​

Всплывающий элемент (CharacterPopUpController) рисует шарик над игроком и над каждым актором. Для всего, у чего нет такого элемента, — последователя, аватара другого игрока, вашего собственного объекта — используйте EmotionBubbleOverBody:

StartCoroutine(EmotionBubbleOverBody.Play(someTransform, balloon, clock: null));

Он подвешивает к телу временный объект, помещает его над самым высоким из спрайтов тела, центрирует по всем спрайтам и на каждом обновлении повторяет прыжок шарика. Когда шарик заканчивается, объект исчезает. Шарик, которому нечего рисовать, или тело без спрайтов не делают ничего.

Справочник​

ТипПространство имёнРоль
EmotionBalloonNamesOpenMon.MCE.Characters.Followers.Talk14 имён и All
EmotionBalloonSetOpenMon.MCE.Characters.Followers.TalkНабор шариков, Default, Resolve, Find
EmotionBubbleOverBodyOpenMon.MCE.Characters.Followers.TalkРисует шарик над любым телом
PlayerEmotesOpenMon.MCE.CharactersСопоставление горячих клавиш и событие Played
PlayerEmoteInputOpenMon.MCE.CharactersЧитает горячие клавиши
CharacterPopUpControllerOpenMon.MCE.ActorsPlayEmotion(name), PlayBalloon(balloon, sound)
PlayEmotionOpenMon.MCE.Actors.CommandGraph.AnimationsУзел скрипта