MVC์ MVVM์ ํฉํ M-VM-C ํจํด์ธ๋ฐ. ์ด๋ฐ ์ด๋ฆ์ ํจํด์ด ์๋? ์๋ง ์ด๊ฒ๋ ๊ทธ๋ฅ MVVM์ด๋ผ ํ์น ๊ป.
//M ๋ฐ์ดํฐ๋ชจ๋ธ.
Item
{
string Name {get;set;}
ItemType Type {get;set}
string SpritePath {get;set}
int Count {get;set}
}
//UserInventory.ํ์ผ (์ ์ ์ ๋ณด)
------- Name, Type, SpritePath, Count
Item 1:
Item 2:
...
Item 100:
์ด์์ ์์ SO๋ฅผ ์ฐ๋ ์ด์ ๋ฅผ ๋ชจ๋ฅด๊ฒ ๋ค๋ง (์ ํ ์คํฌ๋ฆฝํฐ๋ธ ํ ํ์์๋ ์ค์ง ๋ฉค๋ฒ๋ง ์๋๋ฐ)
์ค์ํ๊ฑด ์ด์จ๊ฑฐ๋ ๋ณํ๋ ๊ฐ์ ๋ณด์ธ ์ ์ ์ ๋ณด์ธ Count๋ฅผ ์ ์ฅํด๋ ์๋จ์ ์ด์ฐจํผ ํ์ํ๋จ๊ฑฐ์ผ.
๊ฑฐ๊ธฐ์ ์ถ๊ฐ๋ก Item 100 ๊ฐฏ์๋งํผ์ SO๊ฐ ํ์ํ๊ฒ ์ง. (๋ ์์จ๋ด์ ๋ชจ๋ฅด๊ฒ ๋๋ฐ, ๊ฐ์ ํด๋์ค ์ด๋ฆ(Item)์ SO๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค ์ ์๊ธดํ๋?)
์ด๊ฒ ์ผ๋ง๋ ๋นํจ์จ์ ์ด๋๋ฉด 1)์๊ฒฝ์ฐ ํ๋์ ํ์ผ๋ง ๋ก๋ํ๋ฉด๋๋๋ฐ ๋ 100๊ฐ์ SO๋ฅผ ์ถ๊ฐ๋ก ๋ก๋ํด์ผํ๋จ ๊ฑฐ๊ฒ ์ง. ๊ทธ๊ฑธ ์ํ ์ฝ๋๋ ๋ณ๋๋ก ์์ฑํด์ผํ๊ณ . for๋ฌธ๋๋ ค์ผ์ง.
//์ปจํธ๋กค๋ฌ.
List<Item> itemList;
LoadItemListFromFile()
{
itemList = ๋ก๋ํUserInventory.ToList() as List<Item>; //๋ญ ๋์ถฉ ์ด๋ ๊ฒ ํ๊ฒ ์ง
}
์ด๋ฌ๋ฉด itemList ์๋ item1, 2...100 ์ด ๋ค์ด์๊ฒ ์ง.
๊ทธ๋ผ ๊ทธ 1,2,3... ๊ทธ ๋ฐ์ดํฐ๋ชจ๋ธ(M) ํ๋ํ๋๋ ์์ดํ ์์ด์ฝ์ด ์๋ UI ์ฆ, ItemCell์ ๋ฃ์ด์ผํ ๊ฑฐ์ผ.
(ItemSlot ์ด๋ผ๊ณ ํ๋๊ฒ ๋ ํธํ๊ฒ ์ง๋ง ๋ ์์ด๊ฐ๋ฐ์ฆ์ด ์์ด์ Cell๋กํ๋ค. Slot์ ๊ณ ์ ๋์ด์์ด์ ๊ฑฐ๊ธฐ์ ๋ญ ๋ฃ๋๊ฑฐ๊ณ Cell์ ์ธํฌ๋ผ์ ๊ฑฐ๊ธฐ์ ์๋ฆฌ์ก๋ ๋์ด๋ค.)
//VM
ItemCellVM
{
// VIew. ์ธ์คํํฐ์ ๋ฐ์ธ๋ฉ
[SerializedField] TMP_Text name;
[SerializedField] Image img;
[SerializedField] TMP_Text count;
//Model
public Item ItemData;
public SetItemAndDisplay(Item item)
{
ItemData = item;
name.text = ItemData.Name;
img.sprite = Resources.Load<Sprite>(ItemData.SpritePath);
count.text = ItemData.Count.ToString()
}
}
๋ค์ ์ปจํธ๋กค๋ฌ๋ก ๋์์๋ณด์.
์์ดํ ์ ์ด ๋ง์ ๋งํผ VM ์ธ์คํด์ค๋ ์ฌ๋ฌ๊ฐ๋ค.
๊ฐ๊ฐ์ VM.ItemData์ ํ๋ํ๋ ๋ฃ์ด์ฃผ๋ ค๋ฉด ์ด ๋ชจ๋ VM ์ธ์คํด์ค๋ค์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ ํด์ผ๊ฒ ์ง.
์ด์ฆ์์ ์๋ MVC๋ก itemList์ ๊ฐ ์์๋ค์ ItemCell ์์์ ๋ง์ถฐ์ ๋ฃ์ด์ค์๋ฐ ์ด๊ฑด ์ฌ๊ธฐ์ ์ค๋ช ํ ์ ์๊ณ ๋์ถฉ itemCells ๋ณ์์ ๊ทธ ์ฐธ์กฐ๋ค์ ๊ฐ์ง๊ณ ์๋ค ์น์.
ItemCellVM[] itemCells_VM;
SetItemDataIntoItemCell()
{
for (int i = 0 ; i < itemList.lenght < i++)
itemCells_VM[i]. SetItemAndDisplay(itemList[i]);
}
๋์ง? ์ด์ ์ธ๋ฒคํ ๋ฆฌ์ ์๋ ๊ฐ๊ฐ์ Item ์ฌ๋กฏ์ ๋ฐํ ItemCellVM ๋ค์ ItemData์ Itemํ์ ๋ฐ์ดํฐ ์ธ์คํด์ค๊ฐ ๋ค์ด๊ฐ๊ฑฐ์ผ.
ํน์ ์์ดํ ์ฃผ์ ๋ค?
๊ทธ๋ผ ๋จผ์ ์ปจํธ๋กค๋ฌ์ itemList ์์ ์ด๋ฏธ ์๋์ง ์ฐพ์ด.
์ ์์ดํ ์ ์ถ๊ฐํด์ผํ๋ค?
๊ทธ๋ฌ๋ฉด ์ปจํธ๋ก๋ฌ์ ์๋ itemList์ ๋จผ์ ์๋ก์ด ์์ดํ ์๋ํ Item ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํด. ๊ทธ๋ฆฌ๊ณ ํ์ผ๋ถ๋ฌ์์ ๊ฑฐ๊ธฐ์๋ ์ถ๊ฐํ๊ณ ํ์ผ์ ์ฅํด Count๊ฐ๋ ํฌํจ์ด์ง.
๊ทธ๋ฆฌ๊ณ SetItemDataIntoItemCell() ์ ๋ค์ ํธ์ถํด์ ๋ชจ๋ VM์ธ์คํด์ค๋ค์ ๋ฆฌํ๋ ์ํด.
์ด๋ฏธ์๋ค?
๊ทธ๋ฌ๋ฉด itemList[์ฐพ์์ธ๋ฑ์ค].Count ๋ฅผ ์ฌ๋ ค.
๊ทธ๋ฆฌ๊ณ SetItemDataIntoItemCell() ์ ๋ค์ ํธ์ถํด์ ๋ชจ๋ VM์ธ์คํด์ค๋ค์ ๋ฆฌํ๋ ์ํด.
์ธ๋ฒคํ ๋ฆฌ ์์ดํ ์ ์ ํํ๋๊ฑฐ?
์ด์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅด ์ฐ๋ ์ด๋ฒคํธ๋ฅผ ์ฐ๋ VM์ ๋ฌ์์ ๊ทธ๋์ด ์ด๋๋์ธ์ง ์ปจํธ๋กค๋ฌ์๊ฒ ์๋ ค.
์ด๋ป๊ฒ ํ๋๊ณ ?
delegate ItemCellClickedDelegate(ItemCellVM itemCellVM); // ์ฝ๋ฐฑํธ๋ค๋ฌ๊ฐ ๊ตฌํํด์ผํ ๋ฉ์๋ ์๊ทธ๋์ณ๋ฅผ ์ ์ํ ๋ธ๋ฆฌ๊ฒ์ดํธ
//VM
ItemCellClickedDelegate itemCellClicked;
public CellClickBTN()
{
itemCellClicked(this); //ItemCellClickedDelegate ๋ฉ์์ง ์ ์ก : this๋ก ์์ (ItemCellVM ์ธ์คํด์ค)๋ฅผ ๋ณด๋
}
//์ปจํธ๋กค๋ฌ
์๊น ๋ชจ๋ VM์ธ์คํด์ค์๋ํ ์ฐธ์กฐ๋ฅผ ์๊ฐ ์๋ค๊ณ ํ์ง?
foreach (var cellVM in itemCells)
ย cellVM.itemCellClicked = OnItemCellClicked; // VM๋ง๋คย ItemCellClickedDelegateย ๊ตฌ๋ .
์์ VM์ ๋ฐ์ดํฐ ํ๋์ฉ ๋ฃ์ด์ค๋ ์ด๊ฒ๋ ํด์ค์ผ๋จ. ๊ทธ๋์ผ ๋ฉ์์ง ๋ฐ์.
//ItemCellClickedDelegate ์ฝ๋ฐฑ ํธ๋ค๋ฌ. itemCellVM์ ๋ฉ์์ง์ ์ค๋ ค์จ this ๊ทธ๋.
void OnItemCellClicked(ItemCellVM itemCellVM)
{
// ์ด์ itemCellVM์ด ์ด ๊ทธ ํด๋ฆญํ ์์ดํ ์ ์ด๊ณ itemCellVM.ItemData์ Item ์ด์์ . ์ด๊ฑธ ๊ฐ์ง๊ณ ๋ญ๊ฐ ํด.
}
๋๋ฌด ๋ง์ด ์๋ ค์คฌ๋ค ใ ใ
์, ItemData์ dataIndex ๋ฒํธ๋ ์์ด์๋ฐ ๊ทธ๊ฑธ ๊น๋นกํ๋ค. ๊ทธ๋์ผ ์ฝํธ๋ค๋ฌ ๋ก ์์๋ ๋ฐ์ดํฐ๊ฐ๊ณตํ๊ณ ๋๋ฉด itemList์ ๋ฐ์ํ๊ณ ๋ค์ ๋ฆฌํ๋ ์ํ๋๋ฐ ๊ทธ๊ฑด ๋ ์์์ํด.
ใ ใ ใ ๊ณ ์ํ์
์ด๊ฑฐ ์ด์ ๋ดค๋น ๋กํ
์์ง UI ์ธ๋ฒคํ ๋ฆฌ์ ์์ดํ ์ ํด๋ฆญํด์ ๋ญ๊ฐ ํ๋ ๊ธฐ๋ฅ์ ์๋๋ฐ ๊ทธ ๋ถ๋ถ๋ ์ฐธ๊ณ ํด์ ํด๋ณผ๊ฒ