CommandGraph: Scripting de eventos basado en nodos
El CommandGraph es el sistema de scripting visual de MCE para crear comportamientos de NPCs, cinematicas, misiones y eventos interactivos. Proporciona un editor basado en nodos donde conecta comandos para definir secuencias de eventos, sin necesidad de codigo C#.
Esta es la herramienta principal para disenadores de juego que trabajan con MCE en todos los niveles, incluyendo los niveles DLL donde el codigo fuente no es accesible.
Que es CommandGraph?
CommandGraph es un grafo de nodos adjunto a un Actor (cualquier entidad interactuable en el mundo). Cuando el jugador activa el actor (interactuando, pisando sobre el o entrando en su area), el grafo ejecuta sus nodos en secuencia.
Pienselo como un script visual donde cada nodo es una accion del juego:
[Start] -> [Show Dialog] -> [Branch: Has Badge?]
|-- Yes -> [Give Item] -> [End]
|-- No -> [Show Dialog: "Come back later"] -> [End]
Crear su primer evento
Paso 1: Crear un Actor
- En su escena, cree un GameObject vacio donde quiera el NPC.
- Anade un componente
Actor(o una de sus variantes:SimpleActor,TriggerActor). - Anade un
SpriteRendererpara el visual del NPC. - El actor se registrara automaticamente con el
GridController.
Paso 2: Abrir el editor de CommandGraph
- Seleccione su GameObject Actor.
- En el Inspector, busque la seccion CommandGraph.
- Haga clic en Edit Graph para abrir la ventana del editor de nodos.
Paso 3: Anadir nodos
- Haga clic derecho en el editor de grafo para abrir el menu Add Node.
- Los nodos estan organizados por categoria (ver abajo).
- Seleccione un tipo de nodo para anadirlo al grafo.
- Conecte nodos arrastrando desde el puerto de salida de un nodo al puerto de entrada de otro.
Paso 4: Configurar nodos
Haga clic en un nodo para ver sus propiedades en el panel del Inspector:
- Nodos de dialogo: Ingrese el texto a mostrar, nombre del hablante y retrato.
- Nodos de ramificacion: Seleccione la variable del juego a verificar y la comparacion.
- Nodos de objetos: Elija que objeto dar/quitar y la cantidad.
- Nodos de teletransporte: Establezca la escena destino y posicion.
Tipos de Actor
MCE proporciona varias variantes de actor:
| Tipo de Actor | Disparador | Caso de uso |
|---|---|---|
Actor | El jugador interactua (presiona boton de accion mientras mira) | NPCs, letreros, objetos |
SimpleActor | El jugador interactua, configuracion simplificada | NPCs basicos |
TriggerActor | El jugador pisa o entra en un area | Auto-disparadores, eventos ocultos |
GridSubscribingActor | Responde a eventos de cuadricula | Placas de presion, proximidad |
PushableActor | El jugador lo empuja caminando hacia el | Rocas, bloques de puzzle |
ActorItem | El jugador interactua, da un objeto y desaparece | Objetos recogibles en el suelo |
Categorias de nodos
Dialogos
Mostrar texto, elegir respuestas y gestionar conversaciones.
| Nodo | Descripcion |
|---|---|
| ShowDialog | Mostrar un cuadro de texto con el mensaje del hablante |
| ShowChoiceDialog | Presentar al jugador opciones de seleccion multiple |
| ShowMonsterDialog | Mostrar un dialogo relacionado con un monstruo (muestra sprite) |
| CharacterPopUp | Mostrar un popup sobre la cabeza de un NPC (!, ?, ...) |
Ejemplo de ShowDialog:
Speaker: "Professor Elm"
Text: "Welcome to the world of monsters!"
Portrait: oak_portrait
Wait for Input: true
Ramificaciones
Controlar el flujo basado en condiciones.
| Nodo | Descripcion |
|---|---|
| BranchOnVariable | Verificar una GameVariable y ramificar Si/No |
| BranchOnBadge | Verificar si el jugador tiene una medalla especifica |
| BranchOnItem | Verificar si el jugador tiene un objeto especifico |
| BranchOnMonster | Verificar si el jugador tiene una especie especifica en su equipo |
| BranchOnMoney | Verificar si el jugador tiene suficiente dinero |
| BranchOnRosterCount | Verificar cuantos monstruos hay en el equipo |
Cada nodo de ramificacion tiene dos puertos de salida: True y False.
Objetos
Gestionar el inventario del jugador.
| Nodo | Descripcion |
|---|---|
| GiveItem | Anadir un objeto a la mochila del jugador |
| TakeItem | Quitar un objeto de la mochila del jugador |
| GiveMonster | Anadir un monstruo al equipo del jugador |
| GiveMoney | Anadir dinero a la billetera del jugador |
| TakeMoney | Quitar dinero de la billetera del jugador |
Monstruos
Interactuar con los monstruos del jugador.
| Nodo | Descripcion |
|---|---|
| HealParty | Curar completamente todos los monstruos del equipo |
| SelectMonster | Abrir la pantalla del equipo para que el jugador elija un monstruo |
| TeachMove | Ensenar un movimiento especifico a un monstruo |
| EvolutionCheck | Activar verificaciones de evolucion para todos los miembros del equipo |
| SetNickname | Permitir al jugador renombrar un monstruo |
Batallas
Activar y configurar batallas.
| Nodo | Descripcion |
|---|---|
| StartTrainerBattle | Iniciar una batalla de entrenador con equipo configurado |
| StartWildBattle | Iniciar un encuentro salvaje con un monstruo especifico |
| BranchOnBattleResult | Verificar si el jugador gano la ultima batalla |
Variables
Leer y escribir estado del juego.
| Nodo | Descripcion |
|---|---|
| SetVariable | Establecer una GameVariable a un valor |
| AddToVariable | Sumar a una GameVariable numerica |
| CheckVariable | Leer el valor de una GameVariable para logica |
Las GameVariables son el sistema de estado global. Se persisten en los datos de guardado y pueden verificarse desde cualquier CommandGraph o script.
Sonidos
Controlar la reproduccion de audio.
| Nodo | Descripcion |
|---|---|
| PlayBGM | Cambiar la musica de fondo |
| PlaySE | Reproducir un efecto de sonido |
| StopBGM | Detener la musica actual |
| FadeOutBGM | Desvanecer la musica durante una duracion |
Animaciones
Animar personajes y la camara.
| Nodo | Descripcion |
|---|---|
| MoveActor | Mover un NPC a una posicion destino |
| TurnActor | Girar un NPC para que mire en una direccion |
| WaitSeconds | Pausar el grafo durante una duracion |
| FadeScreen | Fundir la pantalla a negro o de vuelta |
| ShakeScreen | Sacudir la camara |
Teletransportes
Mover al jugador entre ubicaciones.
| Nodo | Descripcion |
|---|---|
| TeleportPlayer | Mover al jugador a un tile especifico en la escena actual |
| WarpToScene | Hacer la transicion del jugador a otra escena |
Misiones (nivel Pro+)
Gestionar el progreso de misiones.
| Nodo | Descripcion |
|---|---|
| StartQuest | Iniciar una mision |
| CompleteObjective | Marcar un objetivo de mision como completado |
| FailQuest | Fallar una mision |
| BranchOnQuestState | Verificar el estado actual de una mision |
| GiveQuestReward | Otorgar las recompensas de una mision |
Tiendas
Abrir interfaces de tienda.
| Nodo | Descripcion |
|---|---|
| OpenShop | Abrir la UI de tienda compra/venta con una lista de objetos configurada |
Guardado
Gestionar datos de guardado.
| Nodo | Descripcion |
|---|---|
| SaveGame | Activar un guardado en la ranura actual |
Utilidades
Nodos de utilidad miscelaneos.
| Nodo | Descripcion |
|---|---|
| DeactivateActor | Ocultar un actor (por ejemplo, despues de dar un objeto recogible) |
| EnablePlayer | Habilitar/deshabilitar el movimiento del jugador |
Conectar nodos
El CommandGraph usa un modelo de conexion basado en flujo:
- Cada nodo tiene un puerto de entrada (lado izquierdo) y uno o mas puertos de salida (lado derecho).
- Conecte un puerto de salida al puerto de entrada de otro nodo para definir el orden de ejecucion.
- Los nodos de ramificacion tienen puertos de salida etiquetados (True/False, Choice1/Choice2/etc.).
- Un nodo sin un puerto de salida conectado termina la ejecucion del grafo.
Ejemplo: NPC de tienda
[Start]
-> [ShowDialog: "Bienvenido! Le gustaria ver mis productos?"]
-> [ShowChoiceDialog: "Comprar" / "Vender" / "No, gracias"]
|-- Choice 1 ("Comprar") -> [OpenShop: item_list_potions]
|-- Choice 2 ("Vender") -> [OpenShop: sell_mode]
|-- Choice 3 ("No, gracias") -> [ShowDialog: "Vuelva cuando quiera!"]
Ejemplo: Dador de misiones
[Start]
-> [BranchOnVariable: "rescued_lost_monster" == true]
|-- True -> [ShowDialog: "Gracias por encontrar a mi monstruo!"]
| -> [BranchOnVariable: "quest_reward_given" == true]
| |-- True -> [ShowDialog: "Disfrute la MT!"]
| |-- False -> [GiveItem: TM_Thunderbolt, 1]
| -> [SetVariable: "quest_reward_given" = true]
| -> [ShowDialog: "Tome esto como agradecimiento!"]
|-- False -> [ShowDialog: "Por favor ayudeme a encontrar a mi monstruo perdido!"]
-> [ShowDialog: "Se escapo hacia la cueva al norte."]
-> [SetVariable: "quest_find_monster" = true]
Ejemplo: Lider de gimnasio
[Start]
-> [BranchOnBadge: "BoulderBadge"]
|-- HasBadge -> [ShowDialog: "Ya ha demostrado su valentia!"]
|-- NoBadge
-> [ShowDialog: "Soy el Lider de Gimnasio! Preparese para la batalla!"]
-> [StartTrainerBattle: gym_leader_team]
-> [BranchOnBattleResult]
|-- Won -> [ShowDialog: "Impresionante! Se ha ganado esto."]
| -> [GiveBadge: "BoulderBadge"]
| -> [GiveItem: TM_RockTomb, 1]
|-- Lost -> [ShowDialog: "Entrene mas duro y vuelva!"]
Probar eventos
- Entre en Modo de juego en el editor.
- Camine con su personaje hasta el actor.
- Presione el boton de interaccion (predeterminado: Z o A en mando).
- El CommandGraph se ejecutara y podra observar el flujo.
Si un grafo no se comporta como se esperaba:
- Verifique la consola para errores.
- Verifique que las GameVariables, objetos y monstruos referenciados existan.
- Asegurese de que todos los puertos de salida esten conectados: una ramificacion no conectada terminara silenciosamente el grafo.
- Use nodos
Debug(si estan disponibles) para registrar estados de variables durante la ejecucion.
Mejores practicas
- Nombre sus actores descriptivamente. "NPC_Professor_Lab" es mejor que "Actor (3)".
- Use GameVariables para estado. No dependa solo de habilitar/deshabilitar actores.
- Pruebe ambas ramificaciones. Cada BranchOnVariable deberia funcionar tanto para la ruta True como False.
- Mantenga los grafos legibles. Use disposicion espacial para hacer claro el flujo. Agrupe nodos relacionados.
- Reutilice patrones. Una vez que tenga un NPC de tienda funcionando, dupliquelo y modifiquelo para otras tiendas.
- Guarde antes de probar. Los cambios en CommandGraph son cambios a nivel de escena que pueden perderse si Unity se cuelga.