Globos de emoción y emotes
Un globo de emoción es la pequeña burbuja animada que aparece sobre la cabeza de un personaje: el signo de exclamación cuando un entrenador te ve, un corazón sobre tu seguidor, un signo de interrogación sobre un NPC confundido. MCE trae 14 globos propios, dibujos originales que tiene todo juego, y deja que un juego sume su propio conjunto por encima.
Los mismos globos sirven a cuatro llamadores distintos:
| Llamador | Cómo pide un globo |
|---|---|
| El jugador | Atajos de teclas de función (F1 a F12, Shift+F1, Shift+F2) |
| Un script | El nodo PlayEmotion en un CommandGraph |
| El seguidor | Un corazón mientras te gruñe (MonsterFollowerController) |
| Otros jugadores | En la capa MMORPG, un globo que se muestra sobre un avatar remoto: ver Emotes en línea |
Todos piden por nombre.
Los 14 globos del motor
Los nombres viven en EmotionBalloonNames (namespace OpenMon.MCE.Characters.Followers.Talk). EmotionBalloonNames.All los lista en el orden que usan los atajos:
| Nombre | Atajo |
|---|---|
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 |
El conjunto propio del motor es un ScriptableObject en Resources/Characters/EmotionBalloons/DefaultEmotionBalloons, así que cualquier juego lo encuentra sin conectar nada.
Atajos del jugador
PlayerCharacter se agrega un componente PlayerEmoteInput en cuanto empieza a recibir entrada. Desde ese momento, los atajos de arriba muestran el globo correspondiente sobre el jugador.
Un atajo solo se dispara cuando el jugador está libre para actuar:
- el jugador no está interactuando (ningún diálogo, menú ni escena lo retiene),
- el juego está corriendo (escala de tiempo mayor que cero),
- el globo anterior terminó: hay un solo globo a la vez.
Cada vez que el jugador local muestra un globo se dispara PlayerEmotes.Played con el nombre del globo. Ese evento es la forma en que la capa en línea se entera de que tiene que avisar a los demás jugadores; tú también puedes escucharlo:
using OpenMon.MCE.Characters;
PlayerEmotes.Played += name => Debug.Log($"The player showed '{name}'.");
PlayerEmotes.NameForHotkey(functionKey, shift) asocia una tecla con el nombre de su globo (devuelve null si la tecla no lleva ninguno).
Mostrar un globo desde un script
Agrega un nodo PlayEmotion (Create Command / Animations / PlayEmotion) a cualquier grafo:
| Campo | Significado |
|---|---|
| Emotion | El nombre del globo (por defecto heart). Un nombre que nadie tiene no reproduce nada, ni siquiera un sonido. |
| Target | El personaje que lo muestra. Vacío: el actor que ejecuta el grafo. |
| On Player | Lo muestra sobre el jugador en su lugar. |
| Wait | Detiene el grafo hasta que el globo desaparece (activado por defecto). Desactivado, el grafo sigue mientras el globo se reproduce. |
PlayExclamation es su hermano más viejo y de un solo propósito: muestra la exclamación sobre un personaje o sobre el jugador, usando la exclamación propia del juego cuando su conjunto tiene una.
El corazón del seguidor
Un seguidor que no tiene una tabla de diálogo propia (un juego que no importó una) muestra el corazón del motor sobre sí mismo mientras gruñe cuando le hablas. El código puede pedirle al seguidor cualquier globo:
// follower is the MonsterFollowerController of the player's follower
StartCoroutine(follower.ShowEmotion(EmotionBalloonNames.Sparkle));
Traer tus propios globos
Un juego reemplaza o amplía los globos del motor con un Emotion Balloon Set (Create > MCE > Characters > Emotion Balloon Set):
| Campo | Significado |
|---|---|
balloons | Los globos: cada uno tiene un name, sus sprites, el sprite que se muestra en cada actualización (spriteByUpdate) y la altura del salto en cada actualización (heightByUpdate). Las líneas de tiempo corren a 60 actualizaciones por segundo; 16 unidades de mapa hacen un tile. |
aliases | Otro nombre para un globo: el nombre que usa un script para uno que el cartucho llama distinto. |
sound | El sonido que hace un globo al aparecer. Vacío: silencioso. |
Asigna el conjunto al campo Emotion Balloons de tu asset MCESettings. Cuando algo pide un globo, EmotionBalloonSet.Resolve(gameSet, name) busca en este orden:
- el conjunto propio del juego, por nombre o alias;
- el conjunto propio del motor (
EmotionBalloonSet.Default).
Así, un juego que define heart obtiene su corazón en todas partes (atajo, script, seguidor y globos que ven otros jugadores), y un juego que no define nada igual tiene los 14.
Los juegos importados de un cartucho (ver Juegos importados y perfiles de juego) reciben un conjunto propio armado por el importador, y el perfil de juego lo asigna a MCESettings (y lo devuelve cuando se restaura el perfil).
Sobre cualquier cuerpo
Un popup (CharacterPopUpController) dibuja el globo sobre el jugador y sobre cada actor. Para todo lo que no tiene popup (un seguidor, el avatar de otro jugador, un objeto tuyo) usa EmotionBubbleOverBody:
StartCoroutine(EmotionBubbleOverBody.Play(someTransform, balloon, clock: null));
Cuelga un objeto temporal del cuerpo, lo coloca sobre el más alto de los sprites del cuerpo, lo centra sobre todos y sigue el salto del globo en cada actualización. Cuando el globo termina, el objeto desaparece. Un globo sin nada que dibujar, o un cuerpo sin sprites, no hace nada.
Referencia
| Tipo | Namespace | Función |
|---|---|---|
EmotionBalloonNames | OpenMon.MCE.Characters.Followers.Talk | Los 14 nombres y All |
EmotionBalloonSet | OpenMon.MCE.Characters.Followers.Talk | Un conjunto de globos, Default, Resolve, Find |
EmotionBubbleOverBody | OpenMon.MCE.Characters.Followers.Talk | Dibuja un globo sobre cualquier cuerpo |
PlayerEmotes | OpenMon.MCE.Characters | Asociación de atajos y el evento Played |
PlayerEmoteInput | OpenMon.MCE.Characters | Lee los atajos |
CharacterPopUpController | OpenMon.MCE.Actors | PlayEmotion(name), PlayBalloon(balloon, sound) |
PlayEmotion | OpenMon.MCE.Actors.CommandGraph.Animations | El nodo de script |