본문으로 건너뛰기

NPC 기억 시스템

NPC가 플레이어의 행동을 기억하고 누적 태도(Attitude)를 계산합니다.

개요

플레이어:
- 상인 물건 3번 훔침
- 마을 주민 구해줌

NPC:
상인: "또 왔네... 내 물건은 건들지 마."
주민: "지난번엔 고마웠어."

컴포넌트

NPCMemory — MonoBehaviour. NPC GameObject에 추가합니다.

필드타입기본값설명
MaxMemoriesint20최대 기억 수. 초과 시 가장 오래된 것 삭제
memoriesList<MemoryEvent>저장된 기억 목록 (Inspector에서 확인 가능)

API

Remember

void Remember(EventType type, float weight = 1f, string context = "")

플레이어 행동을 기억합니다.

매개변수설명
type행동 유형 (EventType 열거형)
weight태도 영향. 양수 = 우호적, 음수 = 적대적
context선택적 설명 문자열
npc.Remember(EventType.Steal, weight: -3f); // 훔침
npc.Remember(EventType.Help, weight: 5f); // 도움
npc.Remember(EventType.Attack, weight: -10f); // 공격
npc.Remember(EventType.Gift, weight: 3f); // 선물

GetAttitude

float GetAttitude()

모든 기억의 weight 합계를 반환합니다.

float attitude = npc.GetAttitude();

// attitude > 0 → 우호적
// attitude == 0 → 중립
// attitude < 0 → 적대적

HasMemory

bool HasMemory(EventType type)

특정 유형의 기억이 있는지 확인합니다.

if (npc.HasMemory(EventType.Steal))
dialogue.Say("또 왔네...");

ForgetOldest

void ForgetOldest()

가장 오래된 기억을 수동으로 삭제합니다. MaxMemories 초과 시 자동 호출됩니다.


EventType 열거형

public enum EventType
{
None,
Steal, // 훔침
Help, // 도움
Attack, // 공격
Trade, // 거래
Talk, // 대화
Threaten, // 협박
Gift, // 선물
Kill, // 처치
Rescue // 구조
}

MemoryEvent 구조

public class MemoryEvent
{
public EventType Type;
public float Timestamp; // Time.time 기준
public float Weight;
public string Context;
}

예제

using NpcMentality;

public class ShopKeeper : MonoBehaviour
{
private NPCMemory _memory;

private void Awake() => _memory = GetComponent<NPCMemory>();

public void OnPlayerSteals()
{
_memory.Remember(EventType.Steal, weight: -3f, context: "귀한 약초");

float attitude = _memory.GetAttitude();
if (attitude < -6f)
{
GuardSystem.Alert(transform.position);
}
}

public string GetGreeting()
{
float attitude = _memory.GetAttitude();
return attitude switch
{
< -5f => "꺼져.",
< 0f => "뭐가 필요해?",
< 5f => "어서오세요.",
_ => "당신 같은 손님이 더 왔으면 해요!"
};
}
}