인물정보, 소지품 분리
This commit is contained in:
BIN
Assets/01_Scenes/TestScene.unity
LFS
BIN
Assets/01_Scenes/TestScene.unity
LFS
Binary file not shown.
@@ -33,7 +33,7 @@ private void Update()
|
||||
|
||||
// 증거품창이 떠 있으면 월드 클릭을 받지 않는다 — 창이 전체 화면 오버레이라서,
|
||||
// 창 위 클릭이 이 존까지 뚫고 들어와 엉뚱한 분기를 여는 것을 막는다
|
||||
if (ItemHud.Instance != null && ItemHud.Instance.IsOpen) return;
|
||||
if (EvidenceHud.Instance != null && EvidenceHud.Instance.IsOpen) return;
|
||||
|
||||
if (Mouse.current == null || !Mouse.current.leftButton.wasPressedThisFrame) return;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -11,7 +11,7 @@ public class StoryState
|
||||
public readonly HashSet<string> CompletedDialogs = new(); // 완료한 DialogGroup 이름
|
||||
public readonly HashSet<string> ChosenCodes = new(); // 골랐던 선택지 Code
|
||||
public readonly HashSet<string> Triggers = new(); // 켜진 트리거 Id (대화 조건 검사용)
|
||||
public readonly List<string> Items = new(); // 가진 아이템 Id (획득 순서 유지 — 증거품창 표시 순서)
|
||||
public readonly List<string> Evidence = new(); // 가진 증거품 항목 Id (획득 순서 유지 = 표시 순서)
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
@@ -20,7 +20,7 @@ public void Clear()
|
||||
CompletedDialogs.Clear();
|
||||
ChosenCodes.Clear();
|
||||
Triggers.Clear();
|
||||
Items.Clear();
|
||||
Evidence.Clear();
|
||||
}
|
||||
|
||||
// ── JSON 변환 ────────────────────────────────────────────────
|
||||
@@ -34,7 +34,7 @@ private class JsonData
|
||||
public List<string> CompletedDialogs = new();
|
||||
public List<string> ChosenCodes = new();
|
||||
public List<string> Triggers = new();
|
||||
public List<string> Items = new();
|
||||
public List<string> Evidence = new();
|
||||
}
|
||||
|
||||
public string ToJson()
|
||||
@@ -48,7 +48,7 @@ public string ToJson()
|
||||
data.CompletedDialogs.AddRange(CompletedDialogs);
|
||||
data.ChosenCodes.AddRange(ChosenCodes);
|
||||
data.Triggers.AddRange(Triggers);
|
||||
data.Items.AddRange(Items);
|
||||
data.Evidence.AddRange(Evidence);
|
||||
return JsonUtility.ToJson(data, prettyPrint: true);
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ public static StoryState FromJson(string json)
|
||||
state.CompletedDialogs.UnionWith(data.CompletedDialogs);
|
||||
state.ChosenCodes.UnionWith(data.ChosenCodes);
|
||||
state.Triggers.UnionWith(data.Triggers ?? new List<string>());
|
||||
state.Items.AddRange(data.Items ?? new List<string>());
|
||||
state.Evidence.AddRange(data.Evidence ?? new List<string>());
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d08e6466f285165448cc7a8751239a65
|
||||
guid: 862d041642c0cda48a942dfe6fbe5057
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
27
Assets/02_Scripts/_Data/Evidence/EvidenceData.cs
Normal file
27
Assets/02_Scripts/_Data/Evidence/EvidenceData.cs
Normal file
@@ -0,0 +1,27 @@
|
||||
using UnityEngine;
|
||||
|
||||
// 증거품 항목 하나 — 소지품이거나 인물이거나.
|
||||
//
|
||||
// 분류(소지품/인물 정보) 필드가 여기 없는 것은 의도된 것이다.
|
||||
// 분류는 EvidenceDatabase의 어느 목록에 넣었는지로 결정된다 — 항목에도 분류 필드를 두면
|
||||
// "목록 위치"와 "필드 값"이 어긋날 수 있으므로, 아예 어긋날 수 없게 한쪽만 남겼다.
|
||||
// 두 분류가 이름·그림·설명이라는 같은 모양을 쓰므로 타입도 나누지 않는다.
|
||||
//
|
||||
// Id가 곧 "제시 키"다 — 대화 노드의 HiddenBranch.Key와 같은 값을 쓰면,
|
||||
// 그 노드가 재생되는 동안 이 항목을 제시했을 때 해당 히든 분기가 열린다.
|
||||
// (DialogTouchZone의 부위 키와 완전히 같은 통로를 쓴다)
|
||||
[CreateAssetMenu(menuName = "Evidence/Evidence Data")]
|
||||
public class EvidenceData : ScriptableObject
|
||||
{
|
||||
[Tooltip("고유 Id — 저장 파일과 히든 분기 Key에 쓰인다. 비우면 에셋 이름")]
|
||||
public string Id;
|
||||
|
||||
[Tooltip("증거품창에 표시할 이름")]
|
||||
public string Name;
|
||||
|
||||
[Tooltip("증거품창에 표시할 그림 (소지품 사진 / 인물 초상)")]
|
||||
public Sprite Icon;
|
||||
|
||||
[Tooltip("증거품창에 표시할 설명")]
|
||||
[TextArea(2, 5)] public string Description;
|
||||
}
|
||||
66
Assets/02_Scripts/_Data/Evidence/EvidenceDatabase.cs
Normal file
66
Assets/02_Scripts/_Data/Evidence/EvidenceDatabase.cs
Normal file
@@ -0,0 +1,66 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
// 증거품의 하위 분류. 어느 목록에 들어 있는지가 곧 분류다 (EvidenceDatabase 참고).
|
||||
public enum EvidenceCategory
|
||||
{
|
||||
[InspectorName("소지품")] Item,
|
||||
[InspectorName("인물 정보")] Profile,
|
||||
}
|
||||
|
||||
// 게임에 존재하는 모든 증거품 항목의 목록 (StoryDatabase와 같은 "단일 원본" 역할).
|
||||
//
|
||||
// 분류마다 목록을 따로 둔다. 데이터를 넣는 사람은 드롭다운을 고를 필요 없이
|
||||
// 해당 목록에 끌어다 놓기만 하면 되고, 분류가 두 곳에 적히지 않으니 어긋날 수도 없다.
|
||||
//
|
||||
// 저장 파일에는 Id 문자열만 남으므로, Id → EvidenceData 복원은 이 에셋이 담당한다.
|
||||
// 게임에 하나만 만들어 EvidenceHud에 꽂아 쓴다.
|
||||
[CreateAssetMenu(menuName = "Evidence/Evidence Database")]
|
||||
public class EvidenceDatabase : ScriptableObject
|
||||
{
|
||||
[Tooltip("소지품 — 물건 증거품")]
|
||||
[SerializeField] private List<EvidenceData> _items = new();
|
||||
|
||||
[Tooltip("인물 정보 — 사건 관계자")]
|
||||
[SerializeField] private List<EvidenceData> _profiles = new();
|
||||
|
||||
public IReadOnlyList<EvidenceData> GetEntries(EvidenceCategory category)
|
||||
=> category == EvidenceCategory.Item ? _items : _profiles;
|
||||
|
||||
// Id로 항목을 찾고 그 분류까지 함께 알려준다. 어느 목록에도 없으면 null.
|
||||
public EvidenceData FindById(string id, out EvidenceCategory category)
|
||||
{
|
||||
category = EvidenceCategory.Item;
|
||||
if (string.IsNullOrEmpty(id)) return null;
|
||||
|
||||
var found = FindIn(_items, id);
|
||||
if (found != null) return found;
|
||||
|
||||
category = EvidenceCategory.Profile;
|
||||
return FindIn(_profiles, id);
|
||||
}
|
||||
|
||||
public EvidenceData FindById(string id) => FindById(id, out _);
|
||||
|
||||
private static EvidenceData FindIn(List<EvidenceData> list, string id)
|
||||
{
|
||||
foreach (var entry in list)
|
||||
{
|
||||
if (entry == null) continue;
|
||||
string entryId = string.IsNullOrEmpty(entry.Id) ? entry.name : entry.Id;
|
||||
if (entryId == id) return entry;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
// 같은 항목을 두 목록에 넣으면 분류가 모호해지므로(먼저 찾은 쪽이 이긴다) 넣는 즉시 알려준다.
|
||||
private void OnValidate()
|
||||
{
|
||||
foreach (var entry in _items)
|
||||
if (entry != null && _profiles.Contains(entry))
|
||||
Debug.LogWarning($"[EvidenceDatabase] '{entry.name}'이(가) 소지품과 인물 정보 " +
|
||||
"양쪽에 있습니다 — 한쪽에서 빼주세요", this);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
using UnityEngine;
|
||||
|
||||
// 증거품/아이템 하나 (역전재판의 법정기록 항목).
|
||||
//
|
||||
// Id가 곧 "제시 키"다 — 대화 노드의 HiddenBranch.Key와 같은 값을 쓰면,
|
||||
// 그 노드가 재생되는 동안 증거품창에서 이 아이템을 클릭했을 때 해당 히든 분기가 열린다.
|
||||
// (DialogTouchZone의 부위 키와 완전히 같은 통로를 쓴다)
|
||||
[CreateAssetMenu(menuName = "Item/Item Data")]
|
||||
public class ItemData : ScriptableObject
|
||||
{
|
||||
[Tooltip("고유 Id — 저장 파일과 히든 분기 Key에 쓰인다. 비우면 에셋 이름")]
|
||||
public string Id;
|
||||
|
||||
[Tooltip("증거품창에 표시할 이름")]
|
||||
public string Name;
|
||||
|
||||
[Tooltip("증거품창에 표시할 그림")]
|
||||
public Sprite Icon;
|
||||
|
||||
[Tooltip("증거품창에 표시할 설명")]
|
||||
[TextArea(2, 5)] public string Description;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
// 게임에 존재하는 모든 아이템의 목록 (StoryDatabase와 같은 "단일 원본" 역할).
|
||||
// 저장 파일에는 Id 문자열만 남으므로, Id → ItemData 복원은 이 에셋이 담당한다.
|
||||
// 게임에 하나만 만들어 ItemHud에 꽂아 쓴다.
|
||||
[CreateAssetMenu(menuName = "Item/Item Database")]
|
||||
public class ItemDatabase : ScriptableObject
|
||||
{
|
||||
[SerializeField] private List<ItemData> _items = new();
|
||||
|
||||
public IReadOnlyList<ItemData> Items => _items;
|
||||
|
||||
public ItemData FindById(string id)
|
||||
{
|
||||
if (string.IsNullOrEmpty(id)) return null;
|
||||
foreach (var item in _items)
|
||||
{
|
||||
if (item == null) continue;
|
||||
string itemId = string.IsNullOrEmpty(item.Id) ? item.name : item.Id;
|
||||
if (itemId == id) return item;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -29,8 +29,8 @@ private void Update()
|
||||
_index++;
|
||||
}
|
||||
|
||||
// Tab → 대화 선택 메뉴 표시
|
||||
if (kb.tabKey.wasPressedThisFrame && DialogEnterHud.Instance != null)
|
||||
// T → 대화 선택 메뉴 표시
|
||||
if (kb.tKey.wasPressedThisFrame && DialogEnterHud.Instance != null)
|
||||
_ = ShowMenu();
|
||||
}
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
// "어떤 대화를 걸지" 고르는 메뉴 (역전재판식 "대화하기" — 후보가 여럿이면 골라서 시작).
|
||||
// "어떤 대화를 걸지" 고르는 메뉴 — 한 캐릭터에게 걸 수 있는 대화가 여럿이면 골라서 시작한다.
|
||||
// DialogEnterUI.uxml의 ListView로 후보를 띄우고, 행을 클릭하면 그 인덱스를 반환한다.
|
||||
// 대사 도중의 분기 선택지(ChoiceHud)와는 별개다 — 이건 대화를 시작하기 전 단계의 UI.
|
||||
// DialogPlayer.SelectBeat가 재생 가능한 비트가 여럿일 때 사용한다.
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0c3122efb3a7a304ca03b2bfaa0fad18
|
||||
guid: 026166c0bdc41234c8ea34d015e7ce9f
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
@@ -4,24 +4,36 @@
|
||||
using UnityEngine.Events;
|
||||
using UnityEngine.UIElements;
|
||||
|
||||
// 증거품창 (역전재판의 법정기록). ItemListUI.uxml을 띄우고 가진 아이템을 좌우 화살표로 넘겨 본다.
|
||||
// 증거품창. 가진 항목을 좌우 화살표로 넘겨 본다.
|
||||
//
|
||||
// 제시(들이대기): 대화 노드가 히든 분기로 무장돼 있는 동안 아이템 그림을 클릭하면
|
||||
// HiddenBranchResolver.Fire(아이템 Id)를 쏜다 — DialogTouchZone의 부위 키와 완전히 같은 통로라서,
|
||||
// 노드에 Key = 아이템 Id 인 히든 분기를 달아두면 그 분기가 열린다. 발동하면 창은 자동으로 닫힌다.
|
||||
// 무장돼 있지 않으면(평소) 클릭해도 아무 일도 없다 — 그냥 열람용 창이다.
|
||||
// 하위 분류가 둘이고 Evidence 버튼 하나로 순환한다: 닫힘 → 소지품 → 인물 정보 → 닫힘.
|
||||
// 두 분류는 같은 창·같은 레이아웃을 쓰고, 보고 있는 분류의 항목만 목록에 오른다.
|
||||
//
|
||||
// 목록은 StoryManager의 아이템 이력(Id)을 ItemDatabase로 복원해 만든다. 획득 순서 = 표시 순서.
|
||||
// 제시(들이대기): 대화 노드가 히든 분기로 무장돼 있는 동안 그림을 클릭하면
|
||||
// HiddenBranchResolver.Fire(항목 Id)를 쏜다 — DialogTouchZone의 부위 키와 완전히 같은 통로라서,
|
||||
// 노드에 Key = 항목 Id 인 히든 분기를 달아두면 그 분기가 열린다. 발동하면 창은 자동으로 닫힌다.
|
||||
// 소지품과 인물 모두 제시할 수 있다. 무장돼 있지 않으면(평소) 클릭해도 아무 일도 없다.
|
||||
//
|
||||
// 목록은 StoryManager의 획득 이력(Id)을 EvidenceDatabase로 복원해 만든다. 획득 순서 = 표시 순서.
|
||||
[RequireComponent(typeof(PanelRenderer))]
|
||||
public class ItemHud : MonoBehaviour
|
||||
public class EvidenceHud : MonoBehaviour
|
||||
{
|
||||
public static ItemHud Instance { get; private set; }
|
||||
public static EvidenceHud Instance { get; private set; }
|
||||
|
||||
[Tooltip("Id → ItemData 복원용 아이템 전체 목록 (게임에 하나)")]
|
||||
[SerializeField] private ItemDatabase _database;
|
||||
[Tooltip("Id → EvidenceData 복원용 전체 목록 (소지품·인물 모두 포함, 게임에 하나)")]
|
||||
[SerializeField] private EvidenceDatabase _database;
|
||||
|
||||
[Tooltip("증거품이 하나도 없을 때 설명 칸에 표시할 문구")]
|
||||
[SerializeField] private string _emptyText = "가지고 있는 증거품이 없습니다.";
|
||||
[Tooltip("창 상단에 표시할 소지품 분류 이름")]
|
||||
[SerializeField] private string _itemCategoryLabel = "소지품";
|
||||
|
||||
[Tooltip("창 상단에 표시할 인물 정보 분류 이름")]
|
||||
[SerializeField] private string _profileCategoryLabel = "인물 정보";
|
||||
|
||||
[Tooltip("가진 소지품이 없을 때 설명 칸에 표시할 문구")]
|
||||
[SerializeField] private string _emptyItemText = "가지고 있는 소지품이 없습니다.";
|
||||
|
||||
[Tooltip("등록된 인물이 없을 때 설명 칸에 표시할 문구")]
|
||||
[SerializeField] private string _emptyProfileText = "등록된 인물이 없습니다.";
|
||||
|
||||
[Tooltip("제시가 실제로 발동했을 때 호출 (연출·사운드용). 발동하지 않은 클릭에는 불리지 않는다")]
|
||||
[SerializeField] private UnityEvent _onPresented;
|
||||
@@ -35,7 +47,8 @@ public class ItemHud : MonoBehaviour
|
||||
|
||||
private PanelRenderer _panelRenderer;
|
||||
private VisualElement _root; // 전체 토글 대상(#Body)
|
||||
private VisualElement _itemNode; // 슬라이드 대상 (.ItemNode — 그림+설명 묶음)
|
||||
private VisualElement _itemNode; // 슬라이드 대상 (.EvidenceNode — 그림+설명 묶음)
|
||||
private Label _categoryLabel; // 창 상단 분류 이름 (#EvidenceCategory)
|
||||
private Image _image;
|
||||
private Label _label;
|
||||
|
||||
@@ -48,8 +61,9 @@ public class ItemHud : MonoBehaviour
|
||||
|
||||
// 현재 표시 상태. 리로드로 요소가 새로 만들어져도 이 값으로 복원된다.
|
||||
private bool _visible;
|
||||
private EvidenceCategory _category = EvidenceCategory.Item; // 지금 보고 있는 분류
|
||||
private int _index;
|
||||
private readonly List<ItemData> _owned = new();
|
||||
private readonly List<EvidenceData> _owned = new();
|
||||
|
||||
// 창이 떠 있는가 (DialogTouchZone이 창 뒤 월드 클릭을 무시하는 데 쓴다)
|
||||
public bool IsOpen => _visible;
|
||||
@@ -100,7 +114,8 @@ private void OnUIReload(PanelRenderer panelRenderer, VisualElement root, int ver
|
||||
_uiVersion = version;
|
||||
|
||||
_root = root.Q<VisualElement>("Body");
|
||||
_itemNode = root.Q(className: "ItemNode");
|
||||
_itemNode = root.Q(className: "EvidenceNode");
|
||||
_categoryLabel = root.Q<Label>("EvidenceCategory");
|
||||
_image = root.Q<Image>("Image");
|
||||
_label = root.Q<Label>("Label");
|
||||
|
||||
@@ -112,11 +127,28 @@ private void OnUIReload(PanelRenderer panelRenderer, VisualElement root, int ver
|
||||
}
|
||||
|
||||
// ── 공개 API (버튼 UnityEvent 연결용) ────────────────────────
|
||||
public void Toggle() { if (_visible) Hide(); else Show(); }
|
||||
|
||||
public void Show()
|
||||
// Evidence 버튼: 닫힘 → 소지품 → 인물 정보 → 닫힘 순으로 순환한다.
|
||||
// 한 버튼으로 열기·분류 전환·닫기를 다 처리한다.
|
||||
public void Toggle()
|
||||
{
|
||||
if (!_visible)
|
||||
Show(EvidenceCategory.Item); // 닫힘 → 소지품
|
||||
else if (_category == EvidenceCategory.Item)
|
||||
Show(EvidenceCategory.Profile); // 소지품 → 인물 정보
|
||||
else
|
||||
Hide(); // 인물 정보 → 닫힘
|
||||
}
|
||||
|
||||
public void Show() => Show(EvidenceCategory.Item);
|
||||
|
||||
public void Show(EvidenceCategory category)
|
||||
{
|
||||
// 분류가 바뀌면 목록 자체가 달라지므로 첫 항목부터 다시 본다
|
||||
if (!_visible || _category != category) _index = 0;
|
||||
|
||||
_visible = true;
|
||||
_category = category;
|
||||
_slideGen++; // 진행 중이던 슬라이드 취소
|
||||
ResetSlideStyle();
|
||||
ApplyState();
|
||||
@@ -131,7 +163,7 @@ public void Hide()
|
||||
}
|
||||
|
||||
// ── 내부 ─────────────────────────────────────────────────────
|
||||
private ItemData CurrentItem =>
|
||||
private EvidenceData CurrentItem =>
|
||||
_owned.Count > 0 && _index >= 0 && _index < _owned.Count ? _owned[_index] : null;
|
||||
|
||||
private void Step(int delta)
|
||||
@@ -228,17 +260,23 @@ private void OnStoryChanged()
|
||||
if (_visible) ApplyState();
|
||||
}
|
||||
|
||||
// 가진 항목 중 "지금 보고 있는 분류"만 추린다. 획득 순서 = 표시 순서.
|
||||
private void RebuildOwned()
|
||||
{
|
||||
_owned.Clear();
|
||||
var story = StoryManager.Instance;
|
||||
if (story == null || _database == null) return;
|
||||
|
||||
foreach (var id in story.ItemIds)
|
||||
foreach (var id in story.EvidenceIds)
|
||||
{
|
||||
var item = _database.FindById(id);
|
||||
if (item != null) _owned.Add(item);
|
||||
else Debug.LogWarning($"[ItemHud] ItemDatabase에 없는 아이템 Id: {id}");
|
||||
// 분류는 항목이 아니라 DB의 어느 목록에 들어 있는지가 정한다
|
||||
var entry = _database.FindById(id, out var category);
|
||||
if (entry == null)
|
||||
{
|
||||
Debug.LogWarning($"[EvidenceHud] EvidenceDatabase에 없는 Id: {id}");
|
||||
continue;
|
||||
}
|
||||
if (category == _category) _owned.Add(entry);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -248,17 +286,22 @@ private void ApplyState()
|
||||
RebuildOwned();
|
||||
if (_index >= _owned.Count) _index = Mathf.Max(0, _owned.Count - 1);
|
||||
|
||||
var item = CurrentItem;
|
||||
// 분류 이름은 항목 유무와 무관하게 항상 지금 보고 있는 분류를 가리킨다
|
||||
if (_categoryLabel != null)
|
||||
_categoryLabel.text = _category == EvidenceCategory.Item
|
||||
? _itemCategoryLabel : _profileCategoryLabel;
|
||||
|
||||
var entry = CurrentItem;
|
||||
if (_image != null)
|
||||
{
|
||||
_image.sprite = item != null ? item.Icon : null;
|
||||
_image.style.visibility = item != null ? Visibility.Visible : Visibility.Hidden;
|
||||
_image.sprite = entry != null ? entry.Icon : null;
|
||||
_image.style.visibility = entry != null ? Visibility.Visible : Visibility.Hidden;
|
||||
}
|
||||
if (_label != null)
|
||||
{
|
||||
_label.text = item != null
|
||||
? $"<b>{item.Name}</b>\n\n{item.Description}"
|
||||
: _emptyText;
|
||||
_label.text = entry != null
|
||||
? $"<b>{entry.Name}</b>\n\n{entry.Description}"
|
||||
: (_category == EvidenceCategory.Item ? _emptyItemText : _emptyProfileText);
|
||||
}
|
||||
|
||||
if (_root != null)
|
||||
8
Assets/05_Textures/Icon/PersonInfo.meta
Normal file
8
Assets/05_Textures/Icon/PersonInfo.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d89f6fafc1f4d4e4bada8627953ce579
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx1.png
LFS
Normal file
BIN
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx1.png
LFS
Normal file
Binary file not shown.
156
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx1.png.meta
Normal file
156
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx1.png.meta
Normal file
@@ -0,0 +1,156 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 68df6ef0ed9e5284db53a4029dc45882
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 1000
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: WindowsStoreApps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx2.png
LFS
Normal file
BIN
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx2.png
LFS
Normal file
Binary file not shown.
156
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx2.png.meta
Normal file
156
Assets/05_Textures/Icon/PersonInfo/PersonInfoEx2.png.meta
Normal file
@@ -0,0 +1,156 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70bb7c2b5f21d0a4ca79053e1473e1c2
|
||||
TextureImporter:
|
||||
internalIDToNameTable: []
|
||||
externalObjects: {}
|
||||
serializedVersion: 13
|
||||
mipmaps:
|
||||
mipMapMode: 0
|
||||
enableMipMap: 0
|
||||
sRGBTexture: 1
|
||||
linearTexture: 0
|
||||
fadeOut: 0
|
||||
borderMipMap: 0
|
||||
mipMapsPreserveCoverage: 0
|
||||
alphaTestReferenceValue: 0.5
|
||||
mipMapFadeDistanceStart: 1
|
||||
mipMapFadeDistanceEnd: 3
|
||||
bumpmap:
|
||||
convertToNormalMap: 0
|
||||
externalNormalMap: 0
|
||||
heightScale: 0.25
|
||||
normalMapFilter: 0
|
||||
flipGreenChannel: 0
|
||||
isReadable: 0
|
||||
streamingMipmaps: 0
|
||||
streamingMipmapsPriority: 0
|
||||
vTOnly: 0
|
||||
ignoreMipmapLimit: 0
|
||||
grayScaleToAlpha: 0
|
||||
generateCubemap: 6
|
||||
cubemapConvolution: 0
|
||||
seamlessCubemap: 0
|
||||
textureFormat: 1
|
||||
maxTextureSize: 2048
|
||||
textureSettings:
|
||||
serializedVersion: 2
|
||||
filterMode: 1
|
||||
aniso: 1
|
||||
mipBias: 0
|
||||
wrapU: 1
|
||||
wrapV: 1
|
||||
wrapW: 0
|
||||
nPOTScale: 0
|
||||
lightmap: 0
|
||||
compressionQuality: 50
|
||||
spriteMode: 1
|
||||
spriteExtrude: 1
|
||||
spriteMeshType: 1
|
||||
alignment: 0
|
||||
spritePivot: {x: 0.5, y: 0.5}
|
||||
spritePixelsToUnits: 1000
|
||||
spriteBorder: {x: 0, y: 0, z: 0, w: 0}
|
||||
spriteGenerateFallbackPhysicsShape: 1
|
||||
alphaUsage: 1
|
||||
alphaIsTransparency: 1
|
||||
spriteTessellationDetail: -1
|
||||
textureType: 8
|
||||
textureShape: 1
|
||||
singleChannelComponent: 0
|
||||
flipbookRows: 1
|
||||
flipbookColumns: 1
|
||||
maxTextureSizeSet: 0
|
||||
compressionQualitySet: 0
|
||||
textureFormatSet: 0
|
||||
ignorePngGamma: 0
|
||||
applyGammaDecoding: 0
|
||||
swizzle: 50462976
|
||||
cookieLightType: 0
|
||||
platformSettings:
|
||||
- serializedVersion: 4
|
||||
buildTarget: DefaultTexturePlatform
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Standalone
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: Android
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: WebGL
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
- serializedVersion: 4
|
||||
buildTarget: WindowsStoreApps
|
||||
maxTextureSize: 2048
|
||||
resizeAlgorithm: 0
|
||||
textureFormat: -1
|
||||
textureCompression: 1
|
||||
compressionQuality: 50
|
||||
crunchedCompression: 0
|
||||
allowsAlphaSplitting: 0
|
||||
overridden: 0
|
||||
ignorePlatformSupport: 0
|
||||
androidETC2FallbackOverride: 0
|
||||
forceMaximumCompressionQuality_BC6H_BC7: 0
|
||||
spriteSheet:
|
||||
serializedVersion: 2
|
||||
sprites: []
|
||||
outline: []
|
||||
customData:
|
||||
physicsShape: []
|
||||
bones: []
|
||||
spriteID: 5e97eb03825dee720800000000000000
|
||||
internalID: 0
|
||||
vertices: []
|
||||
indices:
|
||||
edges: []
|
||||
weights: []
|
||||
secondaryTextures: []
|
||||
spriteCustomMetadata:
|
||||
entries: []
|
||||
nameFileIdTable: {}
|
||||
mipmapLimitGroupName:
|
||||
pSDRemoveMatte: 0
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Assets/07_Data/Evidences.meta
Normal file
8
Assets/07_Data/Evidences.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9b09cc172c45f894db9b9e3c1533fcc9
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/07_Data/Evidences/EvidenceDataBase.asset
LFS
Normal file
BIN
Assets/07_Data/Evidences/EvidenceDataBase.asset
LFS
Normal file
Binary file not shown.
BIN
Assets/07_Data/Evidences/Items/TestItem.asset
LFS
Normal file
BIN
Assets/07_Data/Evidences/Items/TestItem.asset
LFS
Normal file
Binary file not shown.
BIN
Assets/07_Data/Evidences/Items/TestItem2.asset
LFS
Normal file
BIN
Assets/07_Data/Evidences/Items/TestItem2.asset
LFS
Normal file
Binary file not shown.
8
Assets/07_Data/Evidences/PersonInfos.meta
Normal file
8
Assets/07_Data/Evidences/PersonInfos.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 70e101591e3501a4aa2a8826186538bd
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/07_Data/Evidences/PersonInfos/TestPersonInfo1.asset
LFS
Normal file
BIN
Assets/07_Data/Evidences/PersonInfos/TestPersonInfo1.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7429d4a21c14da743a96f5d375125162
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
BIN
Assets/07_Data/Evidences/PersonInfos/TestPersonInfo2.asset
LFS
Normal file
BIN
Assets/07_Data/Evidences/PersonInfos/TestPersonInfo2.asset
LFS
Normal file
Binary file not shown.
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a0dc2a9519a77d040b44e7d2fb237ae9
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -1,18 +1,23 @@
|
||||
<ui:UXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ui="UnityEngine.UIElements" xmlns:uie="UnityEditor.UIElements" noNamespaceSchemaLocation="../../UIElementsSchema/UIElements.xsd" editor-extension-mode="False">
|
||||
<Style src="project://database/Assets/08_UI/GlobalStyle.uss?fileID=7433441132597879392&guid=daee454451ae094468e43c05937249f6&type=3#GlobalStyle"/>
|
||||
<ui:VisualElement name="Body" style="flex-grow: 1; width: 1920px; height: 1080px;">
|
||||
<ui:VisualElement name="Overlay" style="flex-grow: 1; background-color: rgba(0, 0, 0, 0.502); justify-content: center; align-items: center; flex-direction: row; align-self: auto; border-top-width: 5px; border-right-width: 5px; border-bottom-width: 5px; border-left-width: 5px;">
|
||||
<ui:VisualElement style="flex-grow: 0; width: 15%; height: 200px; translate: 0 -50px; align-items: center; justify-content: center; align-self: center; flex-shrink: 0;">
|
||||
<ui:Image name="PrevArrow" source="project://database/Assets/05_Textures/Icon/LeftArrow.png?fileID=2800000&guid=1df29dc2f5c7aa44a91384c40244f89c&type=3#LeftArrow" style="align-self: center; justify-content: center; align-items: center; width: 150px; height: 150px;"/>
|
||||
<ui:VisualElement name="Overlay" style="flex-grow: 1; background-color: rgba(0, 0, 0, 0.502); justify-content: center; align-items: center; flex-direction: column; align-self: auto; border-top-width: 5px; border-right-width: 5px; border-bottom-width: 5px; border-left-width: 5px;">
|
||||
<ui:VisualElement style="flex-grow: 1; height: 12%; width: 100%; justify-content: center; align-items: center; align-self: center;">
|
||||
<ui:Label text="소지품" name="EvidenceCategory" style="justify-content: center; align-items: center; align-self: center; align-content: center; font-size: 64px; color: rgb(255, 255, 255); -unity-text-outline-width: 2px; -unity-font-style: bold;"/>
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="ItemField" style="overflow: hidden; flex-grow: 0; width: 70%; height: 50%; align-self: center; align-content: flex-start; justify-content: center; margin-bottom: 0; flex-shrink: 0; translate: 0 -50px; align-items: center; background-color: rgb(0, 137, 178); border-top-width: 8px; border-right-width: 8px; border-bottom-width: 8px; border-left-width: 8px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149); flex-direction: row; padding-top: 40px; padding-right: 40px; padding-bottom: 40px; padding-left: 40px;">
|
||||
<ui:VisualElement name="" class="ItemNode" style="flex-grow: 1; flex-direction: row; justify-content: center; align-items: center; align-self: center; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149);">
|
||||
<ui:Image name="Image" source="project://database/Assets/05_Textures/Icon/Items/ItemEx.png?fileID=21300000&guid=2cc90f10caab78d4baff76a4c8b030d0&type=3#ItemEx" style="width: 400px; height: 400px; flex-shrink: 0; border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 0; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149);"/>
|
||||
<ui:Label text="아이템 설명입니다." name="Label" style="flex-shrink: 1; flex-grow: 1; height: 400px; margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px; font-size: 30px; -unity-background-image-tint-color: rgb(255, 255, 255); color: rgb(255, 255, 255); -unity-font-style: bold; border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 2px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149);"/>
|
||||
<ui:VisualElement name="VisualElement" style="flex-grow: 1; flex-direction: row; align-self: center; justify-content: center; align-items: flex-start; height: 88%; width: 100%;">
|
||||
<ui:VisualElement style="flex-grow: 0; width: 15%; height: 450px; translate: 0 0; align-items: center; justify-content: center; align-self: auto; flex-shrink: 0; flex-direction: column;">
|
||||
<ui:Image name="PrevArrow" source="project://database/Assets/05_Textures/Icon/LeftArrow.png?fileID=2800000&guid=1df29dc2f5c7aa44a91384c40244f89c&type=3#LeftArrow" style="align-self: center; justify-content: center; align-items: center; width: 150px; height: 150px;"/>
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement name="EvidenceField" style="overflow: hidden; flex-grow: 0; width: 70%; height: 450px; align-self: auto; align-content: flex-start; justify-content: center; margin-bottom: 0; flex-shrink: 0; translate: 0 0; align-items: center; background-color: rgb(0, 137, 178); border-top-width: 8px; border-right-width: 8px; border-bottom-width: 8px; border-left-width: 8px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149); flex-direction: column; padding-top: 32px; padding-right: 32px; padding-bottom: 32px; padding-left: 32px;">
|
||||
<ui:VisualElement name="VisualElement" class="EvidenceNode" style="flex-grow: 1; flex-direction: row; justify-content: center; align-items: center; align-self: center; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149); width: 100%; height: 100%;">
|
||||
<ui:Image name="Image" source="project://database/Assets/05_Textures/Icon/Items/ItemEx.png?fileID=21300000&guid=2cc90f10caab78d4baff76a4c8b030d0&type=3#ItemEx" style="width: 360px; height: 360px; flex-shrink: 0; border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 0; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149);"/>
|
||||
<ui:Label text="아이템 설명입니다." name="Label" style="flex-shrink: 1; flex-grow: 1; height: 360px; margin-top: 0; margin-right: 0; margin-bottom: 0; margin-left: 0; padding-top: 20px; padding-right: 20px; padding-bottom: 20px; padding-left: 20px; font-size: 30px; -unity-background-image-tint-color: rgb(255, 255, 255); color: rgb(255, 255, 255); -unity-font-style: bold; border-top-width: 0; border-right-width: 0; border-bottom-width: 0; border-left-width: 2px; border-left-color: rgb(61, 94, 149); border-right-color: rgb(61, 94, 149); border-top-color: rgb(61, 94, 149); border-bottom-color: rgb(61, 94, 149);"/>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement style="flex-grow: 0; width: 15%; height: 450px; translate: 0 0; align-items: center; justify-content: center; align-self: auto; flex-shrink: 0; flex-direction: column;">
|
||||
<ui:Image name="NextArrow" source="project://database/Assets/05_Textures/Icon/RightArrow.png?fileID=2800000&guid=d7a41d554b939ea4da44c296c31c7a85&type=3#RightArrow" style="align-self: center; justify-content: center; align-items: center; width: 150px; height: 150px;"/>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
<ui:VisualElement style="flex-grow: 0; width: 15%; height: 200px; translate: 0 -50px; align-items: center; justify-content: center; align-self: center; flex-shrink: 0;">
|
||||
<ui:Image name="NextArrow" source="project://database/Assets/05_Textures/Icon/RightArrow.png?fileID=2800000&guid=d7a41d554b939ea4da44c296c31c7a85&type=3#RightArrow" style="align-self: center; justify-content: center; align-items: center; width: 150px; height: 150px;"/>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
</ui:VisualElement>
|
||||
|
||||
Binary file not shown.
Reference in New Issue
Block a user