어제에 이어 과제 노동 하는 날..
[Serializable]
public class PlayerDTO
{
public string Name;
public int Level;
public int Gold;
public int Health;
public int Attack;
public int Shield;
public int Tiredness;
public InventoryDTO Inventory;
public PlayerDTO(string name)
{
Name = name;
Level = 1;
Gold = 20000;
Health = 100;
Attack = 10;
Shield = 10;
Tiredness = 0;
Inventory = new InventoryDTO();
}
...
}
}
[Serializable]
public class InventoryDTO
{
public List<ItemDTO> ItemList;
public InventoryDTO()
{
ItemList = new List<ItemDTO>();
}
public void AddItem(ItemDTO item)
{
ItemDTO curItem = ItemList.Find(x => x.Name == item.Name);
if (curItem != null)
{
curItem.Count += 1;
} else
{
ItemList.Add(item);
}
}
public ItemDTO GetItem(int index)
{
return ItemList[index];
}
}
[Serializable]
public class ItemDTO
{
public string Name;
public ItemType Type;
public string Description;
public int Value;
public int Count;
public bool IsUsed;
public string Image;
public ItemDTO(string name, ItemType type, string description, int value, int count, string image, bool isUsed)
{
Name = name;
Type = type;
Description = description;
Value = value;
Count = count;
Image = image;
IsUsed = isUsed;
}
}
public class DataManager : MonoBehaviour
{
const string ITEM_DB_PATH = "DB/ItemDatabase";
const string PLAYER_DB_PATH = "/Resources/DB/PlayerDatabase";
public static DataManager Instance;
private TextAsset _itemDatabase;
public List<ItemDTO> itemList;
public Dictionary<string, Sprite> itemDicspriteDic;
private void Awake()
{
Instance = this;
_itemDatabase = (TextAsset)Resources.Load(ITEM_DB_PATH);
InitItemList();
InitItemSprite();
}
// DB로부터 전체 아이템 리스트를 받아옴
private void InitItemList()
{
string[] line = _itemDatabase.text.Substring(0, _itemDatabase.text.Length - 1).Split('\n');
for (int i = 0; i < line.Length; i++)
{
string[] row = line[i].Split('\t');
itemList.Add(
new ItemDTO(
row[0],
(ItemType)Enum.Parse(typeof(ItemType), row[1]),
row[2],
int.Parse(row[3]),
int.Parse(row[4]),
row[5],
row[6] == "TRUE"
));
}
}
private void InitItemSprite()
{
itemDicspriteDic = new Dictionary<string, Sprite>();
foreach (ItemDTO item in itemList)
{
itemDicspriteDic.Add(item.Name, Resources.Load<Sprite>($"Images/{item.Image}"));
}
}
#nullable enable
// DB에서 플레이어 정보를 읽어오고 없으면 null 리턴
public PlayerDTO? GetPlayerInfo()
{
try
{
string jdata = File.ReadAllText(Application.dataPath + PLAYER_DB_PATH);
Debug.Log(jdata);
return JsonUtility.FromJson<PlayerDTO>(jdata);
} catch
{
return null;
}
}
// 플레이어 정보를 DB에 저장
public void SavePlayerInfo(PlayerDTO player)
{
string jdata = JsonUtility.ToJson(player);
File.WriteAllText(Application.dataPath + PLAYER_DB_PATH, jdata);
Debug.Log("save " + jdata);
}
}
public class UIInventoryItemContainer : GameUIClass
{
const int LARGE_FONT_SIZE = 35;
const int SMALL_FONT_SIZE = 25;
[SerializeField] private Image _inventoryItemImage;
[SerializeField] private GameObject _inventoryItemStatusImage;
[SerializeField] private TMP_Text _inventoryItemStatusText;
private ItemDTO _item;
// 인벤토리에서 아이템을 클릭하면 팝업이 나타나도록 클릭 리스너 연결
private void Awake()
{
GetComponent<Button>().onClick.AddListener(OpenItemPopUp);
}
private void OpenItemPopUp()
{
UIPopUp uiPopUp = UIManager.Instance.GetUIComponent<UIPopUp>();
uiPopUp.OpenUI();
uiPopUp.SetPopUp(_item);
}
// 각각의 아이템 정보에 따라서 UI를 set
public void SetItemInfo(ItemDTO item)
{
_item = item;
_inventoryItemImage.sprite = DataManager.Instance.itemDicspriteDic[item.Name];
switch (_item.Type)
{
// 소모 아이템일 경우 항상 개수 표시
case ItemType.HEALTH:
_inventoryItemStatusImage.SetActive(true);
SetInventoryItemStatusText(true, _item.Count);
break;
// 장착 아이템일 경우 장착 상태일 때만 장착 표시
case ItemType.ATTACK:
case ItemType.SHIELD:
if (_item.IsUsed)
{
_inventoryItemStatusImage.SetActive(true);
SetInventoryItemStatusText(false, 0);
}
else
{
_inventoryItemStatusImage.SetActive(false);
}
break;
}
}
// 장착 아이템은 장착 상태일 경우 "E" 표시
// 소모 아이템은 개수 표시 (10개 넘으면 10+로 표시)
private void SetInventoryItemStatusText(bool isConsumable, int itemNum)
{
if (isConsumable)
{
_inventoryItemStatusText.text = (itemNum <= 10) ? itemNum.ToString() : "10+";
_inventoryItemStatusText.fontSize = (itemNum <= 10) ? LARGE_FONT_SIZE : SMALL_FONT_SIZE;
} else
{
_inventoryItemStatusText.text = "E";
_inventoryItemStatusText.fontSize = LARGE_FONT_SIZE;
}
}
}
전 언제쯤 욕심을 버릴 수 있나요
끗...