Saltar al contenido principal

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

  1. En su escena, cree un GameObject vacio donde quiera el NPC.
  2. Anade un componente Actor (o una de sus variantes: SimpleActor, TriggerActor).
  3. Anade un SpriteRenderer para el visual del NPC.
  4. El actor se registrara automaticamente con el GridController.

Paso 2: Abrir el editor de CommandGraph

  1. Seleccione su GameObject Actor.
  2. En el Inspector, busque la seccion CommandGraph.
  3. Haga clic en Edit Graph para abrir la ventana del editor de nodos.

Paso 3: Anadir nodos

  1. Haga clic derecho en el editor de grafo para abrir el menu Add Node.
  2. Los nodos estan organizados por categoria (ver abajo).
  3. Seleccione un tipo de nodo para anadirlo al grafo.
  4. 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 ActorDisparadorCaso de uso
ActorEl jugador interactua (presiona boton de accion mientras mira)NPCs, letreros, objetos
SimpleActorEl jugador interactua, configuracion simplificadaNPCs basicos
TriggerActorEl jugador pisa o entra en un areaAuto-disparadores, eventos ocultos
GridSubscribingActorResponde a eventos de cuadriculaPlacas de presion, proximidad
PushableActorEl jugador lo empuja caminando hacia elRocas, bloques de puzzle
ActorItemEl jugador interactua, da un objeto y desapareceObjetos recogibles en el suelo

Categorias de nodos

Dialogos

Mostrar texto, elegir respuestas y gestionar conversaciones.

NodoDescripcion
ShowDialogMostrar un cuadro de texto con el mensaje del hablante
ShowChoiceDialogPresentar al jugador opciones de seleccion multiple
ShowMonsterDialogMostrar un dialogo relacionado con un monstruo (muestra sprite)
CharacterPopUpMostrar 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.

NodoDescripcion
BranchOnVariableVerificar una GameVariable y ramificar Si/No
BranchOnBadgeVerificar si el jugador tiene una medalla especifica
BranchOnItemVerificar si el jugador tiene un objeto especifico
BranchOnMonsterVerificar si el jugador tiene una especie especifica en su equipo
BranchOnMoneyVerificar si el jugador tiene suficiente dinero
BranchOnRosterCountVerificar cuantos monstruos hay en el equipo

Cada nodo de ramificacion tiene dos puertos de salida: True y False.

Objetos

Gestionar el inventario del jugador.

NodoDescripcion
GiveItemAnadir un objeto a la mochila del jugador
TakeItemQuitar un objeto de la mochila del jugador
GiveMonsterAnadir un monstruo al equipo del jugador
GiveMoneyAnadir dinero a la billetera del jugador
TakeMoneyQuitar dinero de la billetera del jugador

Monstruos

Interactuar con los monstruos del jugador.

NodoDescripcion
HealPartyCurar completamente todos los monstruos del equipo
SelectMonsterAbrir la pantalla del equipo para que el jugador elija un monstruo
TeachMoveEnsenar un movimiento especifico a un monstruo
EvolutionCheckActivar verificaciones de evolucion para todos los miembros del equipo
SetNicknamePermitir al jugador renombrar un monstruo

Batallas

Activar y configurar batallas.

NodoDescripcion
StartTrainerBattleIniciar una batalla de entrenador con equipo configurado
StartWildBattleIniciar un encuentro salvaje con un monstruo especifico
BranchOnBattleResultVerificar si el jugador gano la ultima batalla

Variables

Leer y escribir estado del juego.

NodoDescripcion
SetVariableEstablecer una GameVariable a un valor
AddToVariableSumar a una GameVariable numerica
CheckVariableLeer 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.

NodoDescripcion
PlayBGMCambiar la musica de fondo
PlaySEReproducir un efecto de sonido
StopBGMDetener la musica actual
FadeOutBGMDesvanecer la musica durante una duracion

Animaciones

Animar personajes y la camara.

NodoDescripcion
MoveActorMover un NPC a una posicion destino
TurnActorGirar un NPC para que mire en una direccion
WaitSecondsPausar el grafo durante una duracion
FadeScreenFundir la pantalla a negro o de vuelta
ShakeScreenSacudir la camara

Teletransportes

Mover al jugador entre ubicaciones.

NodoDescripcion
TeleportPlayerMover al jugador a un tile especifico en la escena actual
WarpToSceneHacer la transicion del jugador a otra escena

Misiones (nivel Pro+)

Gestionar el progreso de misiones.

NodoDescripcion
StartQuestIniciar una mision
CompleteObjectiveMarcar un objetivo de mision como completado
FailQuestFallar una mision
BranchOnQuestStateVerificar el estado actual de una mision
GiveQuestRewardOtorgar las recompensas de una mision

Tiendas

Abrir interfaces de tienda.

NodoDescripcion
OpenShopAbrir la UI de tienda compra/venta con una lista de objetos configurada

Guardado

Gestionar datos de guardado.

NodoDescripcion
SaveGameActivar un guardado en la ranura actual

Utilidades

Nodos de utilidad miscelaneos.

NodoDescripcion
DeactivateActorOcultar un actor (por ejemplo, despues de dar un objeto recogible)
EnablePlayerHabilitar/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

  1. Entre en Modo de juego en el editor.
  2. Camine con su personaje hasta el actor.
  3. Presione el boton de interaccion (predeterminado: Z o A en mando).
  4. El CommandGraph se ejecutara y podra observar el flujo.
Modo de depuracion

Si un grafo no se comporta como se esperaba:

  1. Verifique la consola para errores.
  2. Verifique que las GameVariables, objetos y monstruos referenciados existan.
  3. Asegurese de que todos los puertos de salida esten conectados: una ramificacion no conectada terminara silenciosamente el grafo.
  4. Use nodos Debug (si estan disponibles) para registrar estados de variables durante la ejecucion.

Mejores practicas

  1. Nombre sus actores descriptivamente. "NPC_Professor_Lab" es mejor que "Actor (3)".
  2. Use GameVariables para estado. No dependa solo de habilitar/deshabilitar actores.
  3. Pruebe ambas ramificaciones. Cada BranchOnVariable deberia funcionar tanto para la ruta True como False.
  4. Mantenga los grafos legibles. Use disposicion espacial para hacer claro el flujo. Agrupe nodos relacionados.
  5. Reutilice patrones. Una vez que tenga un NPC de tienda funcionando, dupliquelo y modifiquelo para otras tiendas.
  6. Guarde antes de probar. Los cambios en CommandGraph son cambios a nivel de escena que pueden perderse si Unity se cuelga.