NPC Mentality
사용법

시간 흐름 세계 시스템

게임 내 시간 흐름에 따라 상점 오픈/닫힘, NPC 스케줄을 자동으로 관리합니다.

개요

08:00 → 상점 오픈
12:00 → NPC 식사
22:00 → 상점 닫힘
02:00 → 도둑 등장

컴포넌트

WorldTimeSystem — MonoBehaviour 싱글턴. 씬에 하나만 배치합니다.

필드타입기본값설명
TimeScalefloat1f시간 배속
CurrentHourfloat0f현재 시간 (0~24, 읽기 전용)

시간 계산

TimeScale = 1  → 1초당 1분 경과  → 하루 = 24분
TimeScale = 60 → 1초당 1시간 경과 → 하루 = 24초

API

Register

void Register(
    string id,
    int openHour,
    int closeHour,
    Action onOpen = null,
    Action onClose = null
)
WorldTimeSystem.Instance.Register(
    "Shop",
    openHour: 8,
    closeHour: 22,
    onOpen:  () => shopkeeper.Open(),
    onClose: () => shopkeeper.Close()
);

IsOpen

bool IsOpen(string id)
if (WorldTimeSystem.Instance.IsOpen("Shop"))
    ShowShopUI();

OnHourChanged 이벤트

event Action<float> OnHourChanged
WorldTimeSystem.Instance.OnHourChanged += hour =>
    Debug.Log($"현재 시간: {Mathf.FloorToInt(hour):D2}:00");

예제

using NpcMentality;

public class VillageScheduler : MonoBehaviour
{
    public CrowdNPC[] villagers;
    public GameObject thiefPrefab;

    private void Start()
    {
        var wt = WorldTimeSystem.Instance;

        wt.Register("Day", openHour: 6, closeHour: 22,
            onOpen:  StartDayRoutine,
            onClose: StartNightRoutine);

        wt.Register("Thief", openHour: 2, closeHour: 4,
            onOpen:  () => Instantiate(thiefPrefab, GetAlleyPosition(), Quaternion.identity),
            onClose: () => DespawnThieves());
    }

    private void StartDayRoutine()
    {
        foreach (var v in villagers) v.enabled = true;
    }

    private void StartNightRoutine()
    {
        foreach (var v in villagers) v.enabled = false;
    }
}

목차