Saltar al contenido principal

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:

LlamadorCómo pide un globo
El jugadorAtajos de teclas de función (F1 a F12, Shift+F1, Shift+F2)
Un scriptEl nodo PlayEmotion en un CommandGraph
El seguidorUn corazón mientras te gruñe (MonsterFollowerController)
Otros jugadoresEn 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:

NombreAtajo
exclamation_markF1
question_markF2
heartF3
music_noteF4
angerF5
sweat_dropF6
sleepF7
happyF8
sadF9
shockedF10
ideaF11
ellipsisF12
sparkleShift+F1
determinedShift+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:

CampoSignificado
EmotionEl nombre del globo (por defecto heart). Un nombre que nadie tiene no reproduce nada, ni siquiera un sonido.
TargetEl personaje que lo muestra. Vacío: el actor que ejecuta el grafo.
On PlayerLo muestra sobre el jugador en su lugar.
WaitDetiene 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):

CampoSignificado
balloonsLos 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.
aliasesOtro nombre para un globo: el nombre que usa un script para uno que el cartucho llama distinto.
soundEl 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:

  1. el conjunto propio del juego, por nombre o alias;
  2. 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​

TipoNamespaceFunción
EmotionBalloonNamesOpenMon.MCE.Characters.Followers.TalkLos 14 nombres y All
EmotionBalloonSetOpenMon.MCE.Characters.Followers.TalkUn conjunto de globos, Default, Resolve, Find
EmotionBubbleOverBodyOpenMon.MCE.Characters.Followers.TalkDibuja un globo sobre cualquier cuerpo
PlayerEmotesOpenMon.MCE.CharactersAsociación de atajos y el evento Played
PlayerEmoteInputOpenMon.MCE.CharactersLee los atajos
CharacterPopUpControllerOpenMon.MCE.ActorsPlayEmotion(name), PlayBalloon(balloon, sound)
PlayEmotionOpenMon.MCE.Actors.CommandGraph.AnimationsEl nodo de script