NPC MEMORY SYSTEMDOCUMENTACIÓN
← Asset
ESEN
Unity 2021.3+
GUÍA OFICIAL

Dale a tus NPCs memoria, relaciones y personalidad.

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.

Motor
Unity 2021.3 LTS+
Render
Built-in y URP
Dependencias
Ninguna externa
01 Un sistema social vivo: cada acción crea recuerdos y transforma la relación de cada NPC con el jugador.
01

PRIMEROS PASOS

Instalación y escena Demo

1

Importa el paquete

Importa NPC Memory & Relationship System en tu proyecto. Espera a que Unity termine de compilar.

2

Abre el Setup Wizard

Ve a Tools → NPC Memory System → Setup Wizard y pulsa "Create Complete Demo Scene".

3

Pulsa Play

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.

WASDMover al jugador
EInteractuar con NPC
RatónSeleccionar acciones
02 El Setup Wizard crea toda la escena: suelo, luz, cámara, jugador, 4 NPCs con diálogos, waypoints y configuraciones ScriptableObject.
02

ARQUITECTURA

Componentes principales

Tres componentes forman el núcleo del sistema. Añádelos a cualquier GameObject para convertirlo en un NPC con cerebro social.

NPC Identity

Add Component → NPC Memory System → NPC Identity

NPC ID
Identificador único y estable. Se usa internamente para memorias, relaciones y guardado.
Display Name
Nombre visible en la UI y los diálogos.

NPC Brain

Add Component → NPC Memory System → NPC Brain

Relationship Config
ScriptableObject con la definición de ejes (Trust, Friendship, etc.) y umbrales de estado.
Memory Decay Config
Velocidad de decaimiento de las memorias.
Impact Database
Reglas que determinan cómo cada tipo de memoria afecta a los ejes de relación.

NPC Registry

Singleton automático

Registro global
Todos los NPCBrain se registran automáticamente. Permite buscar NPCs por ID desde cualquier script.
Editor-safe
Usa un patrón con applicationQuitting para evitar errores al salir del Play mode en el Editor.

NPC Memory API

Clase estática: AIVA.NPCMemorySystem.NPCMemoryAPI

API de conveniencia
Métodos estáticos para añadir memorias, consultar relaciones y obtener NPCs sin necesidad de referencias directas.
Sin dependencias
Funciona desde cualquier script sin requerir referencias en el Inspector.
NamespaceAIVA.NPCMemorySystem
03

MEMORIA

Sistema de 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.

MemoryStore

AddMemory()
Añade una nueva memoria con tag, fuente y fuerza.
GetMemories()
Devuelve todas las memorias activas.
HasMemory(tag)
Comprueba si existe una memoria con ese tag.

Memory Decay Config

Decay Rate
Velocidad a la que las memorias pierden fuerza por segundo.
Min Strength
Umbral mínimo: cuando una memoria baja de este valor, se elimina.

Memory Impact Database

Reglas de impacto
Cada entrada mapea un tag de memoria a cambios en ejes de relación.
Ejemplo
PLAYER_HELPED_ME → Trust +15, Friendship +10.

Crear una memoria por código

// 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");

Tags de memoria incluidos en la demo

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.
04

RELACIONES

Relaciones multi-eje

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.

Ejes predeterminados

EJERANGOEFECTO
Friendship-100 a 100Simpatía general hacia el jugador.
Trust-100 a 100Confianza. Afecta si comparte información o comercia.
Respect-100 a 100Admiración. Los NPCs con alto respeto obedecen peticiones.
Fear0 a 100Miedo. A alto nivel, el NPC huye o se somete.
Romance0 a 100Afinidad romántica. Desactivable por NPC.

Estados de relación

El sistema calcula automáticamente un estado basado en los valores de los ejes:

H

Hostile

El NPC es agresivo. Diálogos hostiles, puede atacar.

U

Unfriendly

Desconfianza. Diálogos fríos, no coopera.

N

Neutral

Estado inicial. Diálogos genéricos.

Friendly

El NPC coopera, ofrece ayuda y comparte información.

Trusted

Máxima confianza. Acceso a diálogos exclusivos y favores especiales.

Consultar relaciones por código

// 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();

Configurar los ejes

Edita el RelationshipConfig ScriptableObject para cambiar nombres de ejes, rangos mínimo/máximo y los umbrales que determinan cada estado.

CrearAssets → Create → NPC Memory System → Relationship Config
REL Amistad, confianza, miedo y rumores evolucionan de forma independiente entre personajes.
05

FACCIONES

Facciones y reputación

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.

Faction Database

  • Define facciones con ID, nombre y descripción.
  • Establece standings predeterminados entre facciones.
  • Los NPCs se asignan a facciones desde su NPCIdentity.

Faction Manager

  • Gestiona la reputación del jugador con cada facción.
  • Propaga cambios: atacar a un guardia baja la reputación con toda la guardia.
  • Dispara OnFactionReputationChanged.
CrearAssets → Create → NPC Memory System → Faction Database
// Consultar reputación con una facción
float rep = FactionManager.Instance.GetReputation("Player", "Guards");

// Modificar reputación
FactionManager.Instance.ModifyReputation("Player", "Guards", -20f);
06

SOCIAL

Rumores y cotilleos

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.

Gossip Config

Spread Interval
Cada cuántos segundos un NPC intenta compartir un rumor.
Spread Range
Distancia máxima para transmitir el rumor.
Max Hops
Cuántas veces puede re-transmitirse un rumor.

Distorsión

Distortion Factor
Cada transmisión puede distorsionar la fuerza del rumor.
Ejemplo
Un rumor de robo puede llegar exagerado o minimizado según la configuración.

Flujo

Paso 1
NPC A presencia un evento → crea memoria.
Paso 2
NPC A está cerca de NPC B → transmite rumor.
Paso 3
NPC B recibe el rumor → se afecta su relación.
CrearAssets → Create → NPC Memory System → Gossip Config
07

INTERACCIÓN

NPC Reactor

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.

03 El inspector personalizado muestra diálogos con colores por estado y la lista de acciones del jugador configurables.

Diálogos por estado

  • Hostile: texto agresivo (rojo).
  • Unfriendly: texto frío (naranja).
  • Neutral: texto genérico (blanco).
  • Friendly: texto amigable (verde).
  • Trusted: texto especial (cyan).

Acciones del jugador

  • Cada acción tiene: nombre visible, tag de memoria, cooldown.
  • Al pulsarla se crea una memoria que afecta la relación.
  • El cooldown impide spam (muestra tiempo restante).
  • Se configura desde el Inspector sin código.

UnityEvents del Reactor

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.
08

VISUAL

Componentes visuales

Componentes opcionales que añaden feedback visual sin código.

NPC World UI

Add Component → NPC Memory System → NPC World UI

Show Name
Muestra el nombre flotante sobre el NPC.
Show Relationship Bar
Barra de color que cambia según la relación (rojo → verde).
Show State Label
Texto con el estado actual (Hostile, Neutral, etc.).
Height Offset
Altura sobre el NPC (1–5).
Bar Width
Ancho de la barra (0.5–3).

NPC State Feedback

Add Component → NPC Memory System → NPC State Feedback

Material Tint
Cambia el color del material según el estado actual.
Particle Burst
Emite partículas al cambiar de estado.
Scale Punch
Efecto de escala al cambiar de estado.
Colores por estado
Configurable en el Inspector con previsualización de color.

NPC State Audio & Animation

Add Component → NPC Memory System → NPC State Audio & Animation

Enter Sound
AudioClip que suena una vez al entrar en un estado.
Loop Sound
AudioClip que suena en bucle mientras permanezca en el estado.
Animator Trigger
Trigger del Animator que se dispara al entrar.
Animator Bool
Bool del Animator activo mientras esté en el estado.

NPC Memory Trigger

Add Component → NPC Memory System → NPC Memory Trigger

Collider / Trigger
Crea memorias automáticamente cuando el jugador entra en un trigger.
UnityEvent
También se puede disparar desde código o eventos del Inspector.
04 World UI activa mostrando nombre y barra de relación sobre cada NPC.
09

MOVIMIENTO

Patrulla y movimiento

Añade movimiento básico a los NPCs con un sistema de waypoints. Tres modos de patrulla y pausa automática durante interacciones.

Configuración

Waypoints
Lista de Transforms que definen la ruta. Se crean como GameObjects hijos.
Move Speed
Velocidad de desplazamiento.
Rotation Speed
Velocidad de giro hacia el siguiente waypoint.
Arrival Distance
Distancia para considerar que ha llegado al punto.
Wait Time
Segundos de espera en cada waypoint.

Modos

Loop
Al llegar al último waypoint, vuelve al primero.
PingPong
Recorre la ruta de ida y vuelta.
Random
Elige el siguiente waypoint aleatoriamente.

Interacción

Stop On Interaction
Pausa la patrulla cuando el NPCReactor está activo (jugador interactuando).
Gizmos
En el Scene view se dibujan esferas y líneas conectando los waypoints.
InspectorAdd Component → NPC Memory System → NPC Patrol
10

PERSISTENCIA

Sistema de guardado

Guarda y carga el estado completo de todos los NPCs: memorias, relaciones, reputación de facciones y estados actuales.

Uso básico

// Guardar
NPCSaveSystem.Instance.SaveToFile();

// Cargar
NPCSaveSystem.Instance.LoadFromFile();

Por defecto guarda en un archivo JSON en Application.persistentDataPath.

Proveedor personalizado

// Implementa ISaveProvider
public class CloudSave : ISaveProvider
{
    public string Save(NPCSaveData data) { ... }
    public NPCSaveData Load(string raw) { ... }
}

// Asigna
NPCSaveSystem.Instance.CustomProvider =
    new CloudSave();

Datos guardados

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.).
11

DESARROLLO

Eventos y API

El sistema proporciona tanto eventos estáticos globales como UnityEvents por NPC. Usa la API estática para interactuar desde cualquier script.

Eventos estáticos (NPCEvents)

// 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}");
};

API principal (NPCMemoryAPI)

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.

UnityEvents en el Inspector

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).
12

EDITOR

Herramientas del editor

El paquete incluye ventanas de editor y custom inspectors para trabajar visualmente.

05 Acceso rápido desde el menú Tools a todas las herramientas del sistema.
DB

Memory Debugger

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
GR

Relationship Graph

Visualizador de nodos con conexiones entre NPCs. Muestra ejes de relación y estados con colores.

Tools → NPC Memory System → Relationship Graph
WZ

Setup Wizard

Crea la escena demo completa, genera ScriptableObjects y configura todo en un clic.

Tools → NPC Memory System → Setup Wizard

Custom Inspectors

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.
13

ARQUITECTURA

Estructura del proyecto

Runtime/Core/NPCBrain, NPCIdentity, NPCRegistry, NPCMemoryAPI
Runtime/Memory/MemoryStore, MemoryDecayConfig, MemoryImpactDatabase
Runtime/Relationships/RelationshipData, RelationshipConfig, RelationshipManager
Runtime/Factions/Faction, FactionDatabase, FactionManager
Runtime/Rumors/GossipConfig, GossipSystem
Runtime/Events/NPCEvents (bus de eventos estático)
Runtime/SaveSystem/NPCSaveSystem, ISaveProvider
Runtime/Integration/NPCReactor, NPCWorldUI, NPCPatrol, NPCStateFeedback, NPCStateAudioAnim, NPCMemoryTrigger
Editor/Custom inspectors, debugger, graph, wizard
Demo/Escena demo completa con 4 NPCs

Assembly Definitions

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.
14

SOPORTE

Solución de problemas

"No script asset for MemoryImpactDatabase"

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.

Los NPCs no aparecen en la escena

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.

La cámara no sigue al jugador

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".

Los diálogos no cambian con la relación

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.

Error de singleton al salir del Play mode

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.

Las partículas o tint no se activan

El componente NPCStateFeedback crea el ParticleSystem programáticamente. Asegúrate de que el GameObject tiene un Renderer con material asignable para el tint.