인물정보, 소지품 분리

This commit is contained in:
2026-07-31 11:51:50 +09:00
parent 23e93a67f8
commit 4dc22eb32b
36 changed files with 598 additions and 120 deletions

View File

@@ -25,10 +25,15 @@ private struct InitialAffection
"진행도 초기값과 마찬가지로 플레이를 시작한 씬의 값만 적용되고, 씬 전환으로 넘어온 경우엔 무시된다")]
[SerializeField] private List<InitialAffection> _initialAffections = new();
[Tooltip("플레이 시작 시 소지 아이템 — 이 씬만 직접 열어 테스트할 때 앞 과정 없이 증거품을 들고 시작하게. " +
// 아래 두 목록은 찾기 쉽게 나눠 둔 것일 뿐, 항목의 실제 분류는 EvidenceDatabase의
// 어느 목록에 등록했는지가 정한다. 여기서 자리를 바꿔도 창에 뜨는 분류는 달라지지 않는다.
[Tooltip("플레이 시작 시 들고 있을 소지품 — 이 씬만 직접 열어 테스트할 때 앞 과정 없이 시작하게. " +
"다른 초기값과 마찬가지로 플레이를 시작한 씬의 값만 적용되고, 씬 전환으로 넘어온 경우엔 무시된다. " +
"실제 게임에서의 획득은 AddItem(터치존·버튼 UnityEvent 등)으로")]
[SerializeField] private List<ItemData> _initialItems = new();
"실제 게임에서의 획득은 AddEvidence(터치존·버튼 UnityEvent 등)으로")]
[SerializeField] private List<EvidenceData> _initialItems = new();
[Tooltip("플레이 시작 시 열려 있을 인물 정보 — 위 소지품과 동작은 같다")]
[SerializeField] private List<EvidenceData> _initialProfiles = new();
private StoryState _state = new();
@@ -47,10 +52,9 @@ private void Awake()
if (init.Character != null)
_state.Affection[IdOf(init.Character)] = init.Amount;
// 테스트용 초기 소지 아이템
foreach (var item in _initialItems)
if (item != null && !_state.Items.Contains(ItemIdOf(item)))
_state.Items.Add(ItemIdOf(item));
// 테스트용 초기 소지 증거품 항목 (두 목록 모두 같은 획득 이력으로 들어간다)
AddInitialEvidence(_initialItems);
AddInitialEvidence(_initialProfiles);
}
else
{
@@ -58,6 +62,13 @@ private void Awake()
}
}
private void AddInitialEvidence(List<EvidenceData> list)
{
foreach (var entry in list)
if (entry != null && !_state.Evidence.Contains(EvidenceIdOf(entry)))
_state.Evidence.Add(EvidenceIdOf(entry));
}
// ── 메인 진행도 ──────────────────────────────────────────────
public int MainProgress
{
@@ -110,29 +121,29 @@ public void SetTrigger(string id)
Changed?.Invoke();
}
// ── 아이템(증거품) ───────────────────────────────────────────
public IReadOnlyList<string> ItemIds => _state.Items;
// ── 증거품 (소지품 · 인물) ───────────────────────────────────
public IReadOnlyList<string> EvidenceIds => _state.Evidence;
public bool HasItem(ItemData item) => item != null && _state.Items.Contains(ItemIdOf(item));
public bool HasEvidence(EvidenceData entry) => entry != null && _state.Evidence.Contains(EvidenceIdOf(entry));
// UnityEvent 연결용 (대화 터치존·월드 버튼 등에서 증거품 획득). 중복 획득은 무시된다.
public void AddItem(ItemData item)
// UnityEvent 연결용 (대화 터치존·월드 버튼 등에서 증거품 항목 획득). 중복 획득은 무시된다.
public void AddEvidence(EvidenceData entry)
{
if (item == null) return;
string id = ItemIdOf(item);
if (_state.Items.Contains(id)) return;
_state.Items.Add(id);
if (entry == null) return;
string id = EvidenceIdOf(entry);
if (_state.Evidence.Contains(id)) return;
_state.Evidence.Add(id);
Changed?.Invoke();
}
public void RemoveItem(ItemData item)
public void RemoveEvidence(EvidenceData entry)
{
if (item == null || !_state.Items.Remove(ItemIdOf(item))) return;
if (entry == null || !_state.Evidence.Remove(EvidenceIdOf(entry))) return;
Changed?.Invoke();
}
// ItemData의 Id를 키로 사용 (비어있으면 에셋 이름) — 캐릭터 IdOf와 같은 규칙
private static string ItemIdOf(ItemData i) => string.IsNullOrEmpty(i.Id) ? i.name : i.Id;
// EvidenceData의 Id를 키로 사용 (비어있으면 에셋 이름) — 캐릭터 IdOf와 같은 규칙
private static string EvidenceIdOf(EvidenceData e) => string.IsNullOrEmpty(e.Id) ? e.name : e.Id;
// ── 선택 이력 ────────────────────────────────────────────────
public bool HasChosen(string code) => _state.ChosenCodes.Contains(code);