Importa el paquete
Importa NPC Memory & Relationship System en tu proyecto. Espera a que Unity termine de compilar.
Un cerebro social modular para NPCs en Unity. Memoria con decaimiento, relaciones multi-eje, facciones, cotilleos, guardado completo y componentes plug & play sin escribir código.
PRIMEROS PASOS
Importa NPC Memory & Relationship System en tu proyecto. Espera a que Unity termine de compilar.
Ve a Tools → NPC Memory System → Setup Wizard y pulsa "Create Complete Demo Scene".
Muévete con WASD, acércate a un NPC y pulsa E para interactuar. Prueba las acciones y observa cómo cambian los diálogos.
ARQUITECTURA
Tres componentes forman el núcleo del sistema. Añádelos a cualquier GameObject para convertirlo en un NPC con cerebro social.
Add Component → NPC Memory System → NPC Identity
Add Component → NPC Memory System → NPC Brain
Singleton automático
applicationQuitting para evitar errores al salir del Play mode en el Editor.Clase estática: AIVA.NPCMemorySystem.NPCMemoryAPI
MEMORIA
Cada NPC almacena memorias como entradas etiquetadas. Con el tiempo, las memorias pierden fuerza según la configuración de decaimiento. Las memorias más recientes e impactantes tienen más peso.
PLAYER_HELPED_ME → Trust +15, Friendship +10.// Añadir memoria a un NPC
NPCMemoryAPI.AddMemory("Guard_A", "PLAYER_HELPED_ME", "Player");
// Comprobar si un NPC recuerda algo
bool remembers = NPCMemoryAPI.GetNPC("Guard_A").MemoryStore.HasMemory("PLAYER_HELPED_ME");
PLAYER_HELPED_MEEl jugador ayudó al NPC. Sube Trust y Friendship.PLAYER_THREATENED_MEEl jugador amenazó al NPC. Sube Fear, baja Trust.PLAYER_STOLE_FROM_MEEl jugador robó al NPC. Baja Trust y Friendship.PLAYER_GIFTED_MEEl jugador regaló algo. Sube Friendship.PLAYER_ATTACKED_MEEl jugador atacó. Sube Fear, baja todo lo demás.PLAYER_SAVED_MEEl jugador salvó al NPC. Gran subida de Trust y Respect.RELACIONES
Las relaciones entre NPCs y el jugador se miden en múltiples ejes independientes. La combinación de estos ejes determina el estado general de la relación.
El sistema calcula automáticamente un estado basado en los valores de los ejes:
El NPC es agresivo. Diálogos hostiles, puede atacar.
Desconfianza. Diálogos fríos, no coopera.
Estado inicial. Diálogos genéricos.
El NPC coopera, ofrece ayuda y comparte información.
Máxima confianza. Acceso a diálogos exclusivos y favores especiales.
// Estado actual de la relación
string state = NPCMemoryAPI.GetRelationshipState("Guard_A", "Player");
// Valor de un eje concreto
float trust = NPCMemoryAPI.GetRelationshipValue("Guard_A", "Player", "Trust");
// Acceso directo al RelationshipManager
var brain = NPCMemoryAPI.GetNPC("Guard_A");
var rel = brain.RelationshipManager.GetRelationship("Player");
Dictionary<string, float> allAxes = rel.ToDictionary();
Edita el RelationshipConfig ScriptableObject para cambiar nombres de ejes, rangos mínimo/máximo y los umbrales que determinan cada estado.
FACCIONES
Agrupa NPCs en facciones. Cuando el jugador realiza una acción contra un NPC, la reputación con toda su facción puede verse afectada.
OnFactionReputationChanged.// Consultar reputación con una facción
float rep = FactionManager.Instance.GetReputation("Player", "Guards");
// Modificar reputación
FactionManager.Instance.ModifyReputation("Player", "Guards", -20f);
SOCIAL
Los NPCs comparten memorias entre ellos como rumores. Un NPC que vio al jugador robar puede contárselo a otro, extendiendo la información por la red social.
INTERACCIÓN
El componente plug-and-play que conecta el sistema de relaciones con la experiencia de juego. Configura diálogos por estado y acciones del jugador sin escribir código.
Conecta lógica de tu juego directamente desde el Inspector:
onBecameHostileSe dispara cuando la relación pasa a Hostile.onBecameUnfriendlySe dispara al pasar a Unfriendly.onBecameNeutralSe dispara al pasar a Neutral.onBecameFriendlySe dispara al pasar a Friendly.onBecameTrustedSe dispara al pasar a Trusted.VISUAL
Componentes opcionales que añaden feedback visual sin código.
Add Component → NPC Memory System → NPC World UI
Add Component → NPC Memory System → NPC State Feedback
Add Component → NPC Memory System → NPC State Audio & Animation
Add Component → NPC Memory System → NPC Memory Trigger
MOVIMIENTO
Añade movimiento básico a los NPCs con un sistema de waypoints. Tres modos de patrulla y pausa automática durante interacciones.
PERSISTENCIA
Guarda y carga el estado completo de todos los NPCs: memorias, relaciones, reputación de facciones y estados actuales.
// Guardar
NPCSaveSystem.Instance.SaveToFile();
// Cargar
NPCSaveSystem.Instance.LoadFromFile();
Por defecto guarda en un archivo JSON en Application.persistentDataPath.
// Implementa ISaveProvider
public class CloudSave : ISaveProvider
{
public string Save(NPCSaveData data) { ... }
public NPCSaveData Load(string raw) { ... }
}
// Asigna
NPCSaveSystem.Instance.CustomProvider =
new CloudSave();
MemoriasTag, fuente, fuerza y timestamp de cada memoria por NPC.RelacionesTodos los ejes y sus valores para cada par NPC-target.FaccionesReputación del jugador con cada facción.EstadosEstado actual de cada relación (Hostile, Neutral, etc.).DESARROLLO
El sistema proporciona tanto eventos estáticos globales como UnityEvents por NPC. Usa la API estática para interactuar desde cualquier script.
// Cuando un NPC recibe una nueva memoria
NPCEvents.OnMemoryAdded += (args) => {
Debug.Log($"{args.NpcId} recordará: {args.Memory.Tag}");
};
// Cuando cambia el estado de una relación
NPCEvents.OnRelationshipStateChanged += (args) => {
Debug.Log($"{args.NpcId}: {args.OldState} → {args.NewState}");
};
// Cuando un NPC recibe un rumor
NPCEvents.OnRumorReceived += (args) => {
Debug.Log($"{args.ReceiverId} oyó un rumor sobre {args.Rumor.Tag}");
};
// Cuando cambia la reputación con una facción
NPCEvents.OnFactionReputationChanged += (args) => {
Debug.Log($"Facción {args.FactionId}: {args.NewValue}");
};
AddMemory(npcId, tag, source)Añade una memoria al NPC especificado.
GetRelationshipState(npcId, targetId)Devuelve el estado: "Hostile", "Unfriendly", "Neutral", "Friendly" o "Trusted".
GetRelationshipValue(npcId, targetId, axis)Devuelve el valor float de un eje concreto.
GetNPC(npcId)Devuelve el componente NPCBrain del NPC.
NPCBrain y NPCReactor exponen eventos que puedes conectar directamente desde el Inspector sin código:
onMemoryAddedNPCBrain: se dispara al recibir una nueva memoria.onMemoryForgottenNPCBrain: se dispara cuando una memoria decae completamente.onRelationshipChangedNPCBrain: se dispara cuando cambia un valor de relación.onStateChangedNPCBrain: se dispara cuando cambia el estado general.onBecameHostile…TrustedNPCReactor: un evento por cada estado (5 eventos).EDITOR
El paquete incluye ventanas de editor y custom inspectors para trabajar visualmente.
Ventana en tiempo real que muestra todas las memorias de cada NPC: tag, fuente, fuerza actual y tiempo restante.
Tools → NPC Memory System → Memory Debugger
Visualizador de nodos con conexiones entre NPCs. Muestra ejes de relación y estados con colores.
Tools → NPC Memory System → Relationship Graph
Crea la escena demo completa, genera ScriptableObjects y configura todo en un clic.
Tools → NPC Memory System → Setup Wizard
Cada componente de integración tiene su propio inspector personalizado:
NPCReactorEditorDiálogos con colores por estado, gestión de acciones del jugador.NPCPatrolEditorGestión de waypoints con "Add Waypoint Here", selección múltiple y estado en runtime.NPCStateFeedbackEditorPrevisualización de colores por estado, toggles de partículas y punch.NPCWorldUIEditorToggles de elementos, sliders de altura y ancho.NPCStateAudioAnimEditorEntradas con colores por estado, campos de audio y animador.ARQUITECTURA
NPCMemoryRelationSystem.RuntimeCódigo de runtime. Referencia a UnityEngine.UI para Canvas world-space.NPCMemoryRelationSystem.EditorCódigo de editor. Solo se compila en el Editor de Unity.NPCMemoryRelationSystem.DemoScripts de la demo. Separados para poder eliminarlos en producción.SOPORTE
Unity requiere que las clases ScriptableObject tengan el mismo nombre que su archivo .cs. Asegúrate de que MemoryImpactDatabase.cs existe como archivo independiente y contiene la clase MemoryImpactDatabase.
Usa Tools → NPC Memory System → Setup Wizard para crear la escena. El wizard crea los objetos en el Editor (no en runtime), así puedes editarlos antes de pulsar Play.
Asegúrate de que el componente DemoCamera tiene asignado el target. Si usas el Setup Wizard, esto se configura automáticamente. El fallback busca un GameObject con el tag "Player".
Verifica que: 1) El NPC tiene NPCBrain con las tres configs asignadas. 2) El NPCReactor tiene diálogos escritos para cada estado. 3) El MemoryImpactDatabase tiene reglas para los tags de memoria que usas.
Los singletons (NPCRegistry, NPCSaveSystem) usan applicationQuitting guard. Si ves errores, asegúrate de no acceder a instancias singleton en OnDestroy o OnDisable durante el cierre.
El componente NPCStateFeedback crea el ParticleSystem programáticamente. Asegúrate de que el GameObject tiene un Renderer con material asignable para el tint.