CommandGraph: scripting de eventos basado en nodos
El CommandGraph es el sistema de scripting visual de MCE para crear comportamientos de NPC, escenas, misiones y eventos interactivos. Ofrece un editor basado en nodos donde conectas comandos para definir secuencias de eventos, sin necesidad de código C#.
Es la herramienta principal para los diseñadores de juegos que trabajan con MCE en todas las ediciones, incluidas las ediciones compiladas en las que el código fuente no se incluye.

Ese cuadro es la salida de un grafo de dos nodos: un cartel con el que el jugador interactuó y un comando ShowSignDialog. Nada de eso se escribió en C#: la misma forma escala a una escena con ramificaciones, y el runtime no distingue la diferencia.
¿Qué es CommandGraph?
Un CommandGraph (ActorCommandGraph) es un grafo de nodos guardado en un Actor (cualquier entidad interactuable del mundo). Cuando se activa el actor, el grafo se ejecuta como una corrutina, un nodo tras otro.
Todo actor tiene varias ranuras de grafo, una por cada momento en el que quieras reaccionar:
| Ranura | Se ejecuta |
|---|---|
| On Enable Command Graph | Cuando el actor se activa. |
| Loop Command Graph | Una y otra vez, mientras no se esté ejecutando otro grafo del actor. |
| Interact Command Graph | Cuando el jugador interactúa con el actor. |
| On Demand Command Graph 0 to 3 | Solo cuando otro grafo lo pide (RunOnDemand, RunMultipleOnDemand). |
Los actores especializados agregan sus propias ranuras: TriggerActor tiene los grafos "el jugador está a punto de entrar / entró / está a punto de ser teletransportado / fue teletransportado" y "un actor fue empujado dentro", ActorCharacter tiene el grafo "spot player" y PushableActor tiene el grafo "push".
Piensa en un grafo como un script visual donde cada nodo es una acción del juego:
[Root] → [ShowDialog] → [IfPlayerHasBadge]
├─ True → [GivePlayerItem] → ...
└─ False → [ShowDialog: "Come back later"]
Crear tu primer evento
Paso 1: Crear un actor
La forma más rápida es el menú de la Jerarquía: haz clic derecho y elige GameObject > MCE > uno de los actores ya preparados:
| Menú | Crea |
|---|---|
Blank/Character, Blank/EmptyTrigger, Blank/Invisible | Un personaje, disparador o actor invisible vacío para que lo rellenes tú |
NPCs/Simple dialog, NPCs/Give item, NPCs/Give monster | Un NPC con un grafo listo de diálogo, regalo de objeto o regalo de monstruo |
Trainers/Static, Circle, Look around, Random look around, Random walk | Entrenadores con los comportamientos habituales |
Other/Sign, Pick up item, árboles cortables, rocas rompibles, rocas empujables, remolinos | Los elementos clásicos del mundo |
También puedes agregar el componente tú mismo. Los tipos de actor concretos son:
| Tipo de actor | Disparador | Caso de uso |
|---|---|---|
SimpleActor | El jugador interactúa (sin gráficos ni lógica extra) | Puntos de interacción invisibles |
ActorCharacter | El jugador interactúa; puede caminar, mirar alrededor y detectar al jugador | NPCs, entrenadores |
TriggerActor | El jugador pisa sobre él (no bloquea el movimiento) | Disparadores automáticos, warps, eventos ocultos |
ActorItem | El jugador interactúa, entrega su objeto y desaparece | Objetos recogibles del suelo |
PushableActor | El jugador lo empuja (es un ActorCharacter) | Rocas, bloques de puzles |
Actor y GridSubscribingActor son clases base abstractas; no las agregas directamente.
Paso 2: Abrir el editor de CommandGraph
- Selecciona el GameObject del actor.
- En el Inspector, busca la ranura de grafo que quieras (por ejemplo Interact Command Graph).
- Haz clic en Edit graph para abrir la ventana del editor de nodos. Delete graph lo vacía.
Paso 3: Agregar nodos
- Haz clic derecho en el editor de grafos.
- Elige Create Command /
<Categoría>/<Nodo>. La categoría es la carpeta del nodo (ver abajo). - Conecta los nodos arrastrando desde el puerto de salida de un nodo al puerto de entrada de otro.
Paso 4: Configurar los nodos
Haz clic en un nodo para editar sus campos en el panel del Inspector: el texto de un diálogo, el objeto y la cantidad de un regalo, el tile de un teletransporte, la variable de una condición.
Categorías de nodos
Estas son las categorías tal como aparecen en el menú Create Command. La lista de abajo nombra los nodos más útiles de cada una; el conjunto completo está en el menú.
Dialogs
| Nodo | Descripción |
|---|---|
| ShowDialog | Muestra un diálogo común |
| ShowChoiceDialog | Muestra un diálogo en el que el jugador elige (un puerto de salida por opción) |
| ShowSignDialog | Muestra un diálogo de cartel |
| ShowNoSkippableDialog | Muestra un diálogo que el jugador no puede saltar |
| NextDialog | Salta al siguiente diálogo |
| ShowUsedMoveDialog | Un diálogo que indica que un monstruo usó un movimiento |
| ShowMonsterPicture | Pone la imagen frontal de un monstruo en una ventana enmarcada, o la quita |
Variables
Condiciones y cambios de variables. Cada nodo If... tiene dos puertos de salida, True y False.
| Nodo | Descripción |
|---|---|
| SetBoolVariable, SetIntVariable | Establece una variable de juego |
| IfBool, IfIntEquals, IfIntCompare | Ramifica según un booleano o un entero comparado con un valor (menor, mayor, igual...) |
| IfIntVariablesCompare | Compara una variable entera con otra variable entera |
| SwitchIntVariable | Un puerto de salida por cada valor de una variable entera |
| WhileBool, WhileCondition | Repite mientras se cumpla una condición |
| IfPlayerCharacterIs, IfPlayerDirectionIs | Ramifica según el personaje jugador elegido o la dirección a la que mira |
| SetTemporalBoolVariable, SetTemporalIntVariable, IfTemporalBool | Variables del actor en ejecución que no se guardan con la partida |
Las variables de juego se eligen mediante una referencia de variable (el almacén global o el de una escena). Persisten en los datos de guardado y se pueden leer desde cualquier grafo o script.
Items
| Nodo | Descripción |
|---|---|
| GivePlayerItem, TakePlayerItem | Agrega o quita un objeto de la mochila del jugador |
| GivePlayerMoney | Da dinero al jugador |
| IfPlayerHasItem | Ramifica según si el jugador tiene un objeto |
| ChooseItemDialog | Pide al jugador que elija un objeto y ejecuta comandos en consecuencia |
Monsters
| Nodo | Descripción |
|---|---|
| GiveMonsters | Da monstruos al jugador (especie fija o aleatoria). Necesita un grant id en la capa en línea: ver Regalos de monstruos |
| HealPlayerRoster | Cura a todo el equipo |
| ChooseMonsterDialog, ChooseTwoMonstersDialog | Pide al jugador que elija uno o dos monstruos |
| ChangeMonsterNickname, RemoveMonsterNickname | Renombra un monstruo |
| MoveTutor, RemindPreviouslyLearntMoves | Enseña un movimiento o recuerda movimientos anteriores |
| IfMonsterCanLearnMove, IfRosterHasMove | Ramifica según los movimientos |
| OpenStorage | Abre el almacenamiento de monstruos |
Battles
| Nodo | Descripción |
|---|---|
| SingleTrainerFight | Lucha contra un solo entrenador |
| SingleWildFight, DoubleWildFight | Dispara una lucha contra monstruos salvajes |
| FightFromTemplate | Lanza una lucha a partir de una plantilla de batalla |
| RandomFightAgainstRandomRosters | Una lucha aleatoria contra uno o dos equipos aleatorios |
| StartTowerRun | Inicia una carrera de la Torre de Batalla |
| IfCanHaveDoubleBattle | Ramifica según si es posible una batalla doble |
Badges, Dex, Quests
| Nodo | Descripción |
|---|---|
| GiveBadge, IfPlayerHasBadge | Da una medalla / comprueba si se tiene |
| GiveDex, IfPlayerHasDex, IfDexIsComplete, RegisterMonsterAsSeen | Gestión de la dex |
| StartQuest, UpdateQuestObjective, ProgressQuestObjective, CompleteQuest, FailQuest | Progreso de misiones (ver Sistema de misiones) |
| IfPlayerHasQuest, IfCompletedQuest, IfQuestFailed, IfCurrentQuestObjective | Ramifica según el estado de la misión |
Animations
Personajes, el jugador y la pantalla.
| Nodo | Descripción |
|---|---|
| Move, MovePlayer, WalkToPlayer | Hace caminar a un personaje, al jugador, o hacia el jugador |
| Look, LookAtPlayer, ForcePlayerToLook | Gira a un personaje |
| JumpCharacter, WanderWithinRange | Salta; deambula alrededor de un tile inicial |
| HideCharacter, ShowCharacter, HidePlayer, ShowPlayer | Muestra u oculta gráficos |
| MoveFollower, LookFollower | Hace caminar o girar al monstruo que sigue al jugador |
| FadeScreenToBlack, OpenDoor | Funde la pantalla a negro; abre una puerta en el tile del actor |
| PlayExclamation, PlayEmotion | Muestra un globo sobre un personaje: ver Globos de emoción y emotes |
Sounds
| Nodo | Descripción |
|---|---|
| PlayMusic, StopMusic, SaveMusic, RestoreSceneMusic | Música del mundo por encima de la propia del mapa |
| PlaySound, PlayMonsterCry, WaitForAudio | Sonidos y gritos |
Shops, Trade, Saves, Breeding
| Nodo | Descripción |
|---|---|
| BuyInShop, SellInShop | Ejecuta la lógica de la tienda para comprar o vender |
| TradeSelectedMonster | Intercambia el monstruo que el jugador eligió |
| AutoSaveIfEnabled | Guarda automáticamente si está activado en la configuración |
| StoreTwoSelectedMonstersInNursery, IfEggIsReady, BreedEggInNurseryAndGiveToPlayer | La guardería |
Utils
| Nodo | Descripción |
|---|---|
| TeleportPlayer | Teletransporta al jugador a otra ubicación (validado por el servidor cuando hay conexión) |
| TeleportActorInsideScene, PlaceActor | Mueve un actor dentro de la escena actual |
| WaitTime, LoopXTimes, RunInParallel | Temporización y flujo |
| LockPlayerInput | Bloquea o desbloquea el movimiento del jugador durante una escena |
| SetActorActive, AutoDestroy | Apaga otro objeto, o destruye el actor |
| SwitchOnDayMoment, SwitchTimeOfDay | Ramifica según el momento del día, o lo establece |
| SetLastHealLocation, SetLastHealLocationToCurrent | Dónde reaparece el jugador tras perder |
| LogMessage | Registra un mensaje en la consola |
Conectar nodos
El CommandGraph usa un modelo de conexión basado en flujo:
- Cada grafo empieza en un nodo Root.
- Cada nodo tiene un puerto de entrada y uno o más puertos de salida.
- La mayoría de los nodos tiene exactamente un puerto de salida (el siguiente comando). Los nodos
If...tienen True y False;ShowChoiceDialogtiene un puerto por opción;SwitchOnDayMomenttiene uno por momento del día. - Un nodo sin puerto de salida conectado termina esa rama del grafo.
Ejemplo: NPC de tienda
[Root]
→ [ShowDialog: "Welcome! Would you like to browse my wares?"]
→ [ShowChoiceDialog: "Buy" / "Sell" / "No thanks"]
├─ "Buy" → [BuyInShop]
├─ "Sell" → [SellInShop]
└─ "No thanks" → [ShowDialog: "Come back anytime!"]
Ejemplo: quien da una misión
[Root]
→ [IfBool: rescued_lost_monster]
├─ True → [IfBool: quest_reward_given]
│ ├─ True → [ShowDialog: "Thanks again!"]
│ └─ False → [GivePlayerItem: TM, 1]
│ → [SetBoolVariable: quest_reward_given = true]
│ → [ShowDialog: "Take this as thanks!"]
└─ False → [ShowDialog: "Please help me find my lost monster!"]
→ [SetBoolVariable: quest_find_monster = true]
Ejemplo: líder de gimnasio
[Root]
→ [IfPlayerHasBadge: Boulder Badge]
├─ True → [ShowDialog: "You've already proven yourself!"]
└─ False
→ [ShowDialog: "I am the Gym Leader! Prepare for battle!"]
→ [SingleTrainerFight]
├─ On Player Won → [ShowDialog: "Impressive! You've earned this."]
│ → [GiveBadge: Boulder Badge]
└─ On Player Lost → [ShowDialog: "Train harder and come back!"]
SingleTrainerFight tiene tres puertos de salida: el puerto simple del siguiente comando, On Player Won y On Player Lost. La rama "lost" solo se ejecuta cuando el nodo está configurado para no reaparecer al jugador tras una derrota.
Probar eventos
- Entra en Play Mode en el editor.
- Camina con tu personaje hasta el actor.
- Pulsa el botón de interacción.
- El grafo se ejecuta y puedes ver el flujo.
Si un grafo no se comporta como esperabas:
- Revisa la Consola en busca de errores.
- Verifica que existan las variables de juego, objetos y monstruos referenciados.
- Asegúrate de que todos los puertos de salida estén conectados: un puerto sin conectar termina esa rama en silencio.
- Agrega un nodo LogMessage para imprimir valores durante la ejecución.
Buenas prácticas
- Nombra tus actores de forma descriptiva. "NPC_Professor_Lab" es mejor que "Actor (3)".
- Usa variables de juego para el estado. No te apoyes solo en activar/desactivar actores.
- Prueba ambas ramas. Cada nodo
If...debe funcionar para True y para False. - Mantén los grafos legibles. Usa la disposición espacial para aclarar el flujo. Agrupa los nodos relacionados.
- Reutiliza patrones. Cuando tengas un NPC de tienda que funcione, duplícalo y modifícalo para otras tiendas.
- Guarda antes de probar. Los cambios del CommandGraph son cambios a nivel de escena que se pueden perder si Unity se cierra de forma inesperada.
Para la parte de C# (ejecutar un grafo desde código o escribir tu propio nodo), consulta la API de CommandGraph.