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์ธ์Šคํ„ด์Šค๋“ค์„ ๋ฆฌํ”„๋ ˆ์‹œํ•˜๊ธฐ ์‹ซ์–ด? ๊ทธ๋Ÿผ ๋จธ๋ฆฌ๋น„ํ‹€์–ด์„œ ํ•„์š”ํ•œ๋†ˆ๋งŒ ๋ฆฌํ”„๋ ˆ์‹œํ•  ์„ค๊ณ„๋ฅผ ๋„ˆ๊ฐ€ ์•Œ์•„์„œ ์ถ”๊ฐ€ํ•ด๋ผ.

์ธ๋ฒคํ† ๋ฆฌ ์•„์ดํ…œ์„ ์„ ํƒํ•˜๋Š”๊ฑฐ?

์ด์ œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅด ์“ฐ๋“  ์ด๋ฒคํŠธ๋ฅผ ์“ฐ๋“  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 ์ด์ž–์•„ . ์ด๊ฑธ ๊ฐ€์ง€๊ณ  ๋ญ”๊ฐ€ ํ•ด.

}


๋„ˆ๋ฌด ๋งŽ์ด ์•Œ๋ ค์คฌ๋„ค ใ……ใ…‚