UNITY/PROJECT

[๊ตฌํ˜„] ์œ ๋‹ˆํ‹ฐ๋กœ ์‰ฝ๊ฒŒ ์ธ๋ฒคํ† ๋ฆฌ ๊ตฌํ˜„ํ•˜๊ธฐ 1

ozllzL 2021. 12. 8. 16:42

์ธ๋ฒคํ† ๋ฆฌ์— ๋„ฃ์–ด์•ผ ํ•˜๋Š” ์•„์ดํ…œ ๊ฐœ์ˆ˜๊ฐ€ ์•„์ฃผ ๋งŽ์ง€๋Š” ์•Š์„ ๊ฒฝ์šฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค.

 

1. ์•„์ดํ…œ ์ •๋ณด json์ €์žฅ

์˜์–ดํŒ์„ ๊ฒจ๋ƒฅํ•˜์—ฌ ์ด๋ ‡๊ฒŒ ์ผ๋Š”๋ฐ ๊ผญ ์ด๋ ‡๊ฒŒ ์•ˆํ•ด๋„ ๋œ๋‹ค

[
  {
    "Item": [
      {(์ฒซ๋ฒˆ์งธ ์•„์ดํ…œ์˜ ์ •๋ณด)
        "ID": (๊ณ ์œ ๋ฒˆํ˜ธ),
        "Name": [
          { "KOR": (ํ•œ๊ธ€์ด๋ฆ„) },
          { "ENG": (์˜์–ด์ด๋ฆ„) }
        ],
        "Detail": [
          { "KOR": (ํ•œ๊ธ€ ์„ค๋ช…) },
          { "ENG": (์˜์–ด ์„ค๋ช…) }
        ],
        "Price" :  (๊ฐ€๊ฒฉ)
      },

      {(๋‘๋ฒˆ์งธ ์•„์ดํ…œ์˜ ์ •๋ณด)},

      ...

      ]

   },

   {
    "Hair": [
      {(์ฒซ๋ฒˆ์งธ ๋จธ๋ฆฌ์˜ ์ •๋ณด)},

      {(๋‘๋ฒˆ์งธ ๋จธ๋ฆฌ์˜ ์ •๋ณด)},

      ...

      ]

    }

    {

     "Outfit": [

      {(์ฒซ๋ฒˆ์งธ ์˜์ƒ์˜ ์ •๋ณด)},

      {(๋‘๋ฒˆ์งธ ์˜์ƒ์˜ ์ •๋ณด)},

      ...

      ]

    }

๊ผด์ด๋‹ค.

 

2. ์•„์ดํ…œ/ ๋จธ๋ฆฌ/ ์˜์ƒ ๊ฐœ์ˆ˜ & ๋ณด์œ  ์—ฌ๋ถ€ ์ €์žฅ

์ด๊ฑด ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ ๋ฟ ์•„๋‹ˆ๋ผ ์ €์žฅ๋„ ๊ฐ€๋Šฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ €์žฅํ•  ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

์•„์ดํ…œ์€ ๊ฐœ์ˆ˜ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๋จธ๋ฆฌ,์˜์ƒ๊ณผ ๋‹ค๋ฅธ๋ฐ ๋จธ๋ฆฌ, ์˜์ƒ์€ ๊ฑฐ์˜ ํก์‚ฌํ•˜๋ฏ€๋กœ

(์ด์ดํ…œ์€ ์ƒ€๋˜ ๊ฑฐ ๋˜ ์‚ด ์ˆ˜ ์žˆ๋Š”๋ฐ ๋จธ๋ฆฌ, ์˜์ƒ์€ ์•ˆ๋จ)

์•„์ดํ…œ ๋”ฐ๋กœ, ๋จธ๋ฆฌ ์˜์ƒ์€ ๋ฐฐ์—ด๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.(๊ฐ™์€ ์ฝ”๋“œ ๋‘๋ฒˆ ์“ฐ๊ธฐ ์‹ซ์–ด์„œ)

 

ํ˜•ํƒœ๋Š”

{
  "itemCounts": [ (์ฒซ ๋ฒˆ์งธ ์•„์ดํ…œ ๋ณด์œ  ๊ฐœ์ˆ˜), (๋‘ ๋ฒˆ์งธ ์•„์ดํ…œ ๋ณด์œ  ๊ฐœ์ˆ˜),  ... ],
  "have": [
    { "haveList": [ (์ฒซ ๋ฒˆ์งธ ๋จธ๋ฆฌ ๋ณด์œ  ์—ฌ๋ถ€), (๋‘ ๋ฒˆ์งธ ๋จธ๋ฆฌ ๋ณด์œ  ์—ฌ๋ถ€), ... ] },
    { "haveList": [ (์ฒซ ๋ฒˆ์งธ ์˜์ƒ ๋ณด์œ  ์—ฌ๋ถ€), (๋‘ ๋ฒˆ์งธ ์˜์ƒ ๋ณด์œ  ์—ฌ๋ถ€), ...  ] }
  ]
}

์ด๋ ‡๊ฒŒ ์ €์žฅํ–ˆ๋‹ค.

 

๊ทผ๋ฐ, ๋‹ค์ค‘๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋ฉด jsonํŒŒ์ผ ๋งŒ๋“ค ๋•Œ ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค.

๊ทธ๋•Œ ์–ด๋–ป๊ฒŒ ํ–ˆ๋Š”์ง€ ๋„์ €ํžˆ ๊ธฐ์–ต์ด ์•ˆ๋‚˜์„œ ๋Œ€์ถฉ ์ด๋Ÿด๊ฒƒ์ด๋‹ค~ ์ถ”์ธกํ•ด๋ณด๋ฉด

(๋˜‘๊ฐ™์ด ๊ตฌํ˜„ํ•ด๋ณผ๋ ค๊ณ  ํ•ด๋ดค๋Š”๋ฐ ์ž˜ ์•ˆ๋œ๋‹ค...)

{
  "itemCounts": [ 0, 0, 0, 0, 0, 0 ],
  "have": [
    {[ false, false, false, false, false ]},
    {[ false, false, false, false, false, false, false, false, false, false, false ]}
  ]
}

์ด๋Ÿฐ ์‹์œผ๋กœ ์ €์žฅ์ด ๋˜์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.!!!ํ™•์‹คํ•˜์ง„ ์•Š์Œ!!!

์–ด์จŒ๋“  ์ €์žฅ ์ž์ฒด๊ฐ€ ์ฝ์–ด ์˜ฌ ์ˆ˜ ์—†๋Š”, ์˜ค๋ฅ˜๋‚˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ €์žฅ์ด ๋˜์–ด์„œ

์–ด๋–ป๊ฒŒ ๋๋˜ ์ค‘์š”ํ•œ๊ฑด, ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํด๋ž˜์Šค์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

[System.Serializable]
public class ItemCount
{
    public int[] itemCounts;
    public Have[] have;

    public ItemCount(int itemNum, int hairNum, int outfitNum)
    {

        int[] itemCounts = new int[itemNum];
        bool[] hairHave = new bool[hairNum];
        bool[] outfitHave = new bool[outfitNum];

        for (int i = 0; i < itemNum; i++)
            itemCounts[i] = 0;
        for (int i = 0; i < hairNum; i++)
            hairHave[i] = false;
        for (int i = 0; i < outfitNum; i++)
            outfitHave[i] = false;

        this.itemCounts = itemCounts;

        have = new Have[2];
        have[0] = new Have(hairHave);
        have[1] = new Have(outfitHave);

    }

    public void SetItemCount(ItemCount itemCount)
    {
        itemCounts = itemCount.itemCounts;
        have = itemCount.have;
    }

}

[System.Serializable]
public class Have
{
    public bool[] haveList;
    public Have(bool[] _haveList)
    {
        haveList = _haveList;
    }
}

๋‹ค์ค‘๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ , ํด๋ž˜์Šค์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•  ๋ฐฐ์—ด์„ ํด๋ž˜์Šค ์•ˆ์œผ๋กœ ๋„ฃ์–ด๋ฒ„๋ ธ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐฐ์—ด ์•ˆ์˜ ๋ฐฐ์—ด๋กœ ํ‚ค ๋ถ™์–ด์„œ ์˜ˆ์˜๊ฒŒ ์ €์žฅ์ด ๋œ๋‹ค.

๋‹ค๋งŒ ์˜์ƒ๊ณผ ํ—ค์–ด๊ฐ€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด ์ด๋ฆ„์€ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๊ฒŒ ๋˜๊ธด ํ–ˆ๋‹ค...

[System.Serializable]๋Š” ์ €์žฅํ•  ํด๋ž˜์Šค๋Š” ๋ถ™์—ฌ์ฃผ์–ด์•ผ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

{
  "itemCounts": [ 0, 0, 0, 0, 0, 0 ],
  "have": [
    { "haveList": [ false, false, false, false, false ] },
    { "haveList": [ false, false, false, false, false, false, false, false, false, false, false ] }
  ]
}

3. ์–˜๋„ค Json์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

public class ItemSaveLoad : MonoBehaviour
{

    private JsonData itemInfoList;
    private ItemCount itemCountInfoMain;

    public void Awake()
    {
        itemInfoList = ItemInfoLoad();
        int itemCountNum = itemInfoList[0][0].Count;
        int hairCountNum = itemInfoList[1][0].Count;
        int outfitCountNum = itemInfoList[2][0].Count;

        itemCountInfoMain = new ItemCount(itemCountNum, hairCountNum, outfitCountNum);

    }

   ...

    //์•„์ดํ…œ ์ •๋ณด ๋กœ๋“œ
    public JsonData ItemInfoLoad()
    {
        TextAsset tempGoodsJsonString = Resources.Load<TextAsset>("ItemList");
        itemInfoList = JsonMapper.ToObject(tempGoodsJsonString.ToString());
        return itemInfoList;
    }

    public JsonData GetJsonData()
    {
        return itemInfoList;
    }

    //์•„์ดํ…œ ๊ฐœ์ˆ˜ ๋กœ๋“œ
    public void ItemCountInfoLoad()
    {
        if (File.Exists(FilePath.savePath  +"/ItemCount.json"))
        {
            string tempCountJsonString = File.ReadAllText(FilePath.savePath  +"/ItemCount.json");
            ItemCount tempCountData = JsonUtility.FromJson<ItemCount>(tempCountJsonString);
            itemCountInfoMain.SetItemCount(tempCountData);
        }
        else
            return;
    }

    public void CountSave()
    {
        string tempCountJsonString = JsonUtility.ToJson(itemCountInfoMain);
        File.WriteAllText(FilePath.savePath + "/ItemCount.json", tempCountJsonString);
    }

    public ItemCount GetItemCount()
    {
        return itemCountInfoMain;
    }

    public void UpdateItemCount(ItemCount count)
    {
        itemCountInfoMain.SetItemCount(count);
    }

    public void SaveUpdate(ItemCount count)
    {
        UpdateItemCount(count);
        CountSave();
        ItemCountInfoLoad();
        GetComponent<LoadItems>().Refresh();
    }
}

๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ €์žฅํ•˜๊ณ  ๋‹ค ํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.

LitJson์„ ์‚ฌ์šฉํ–ˆ์œผ๋ฉฐ(using LitJson ๊ผญ ์จ์ค˜์•ผ ํ•œ๋‹ค!)

๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์—ฌ๊ธฐ์— ์žˆ๋Š” itemCountMain๊ณผ itemInfoList์— ์•„์ดํ…œ ์ •๋ณด ๋ถˆ๋Ÿฌ์˜จ๊ฑฐ ์ €์žฅ ํ•ด ๋†“๊ณ ,

๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ์—์„œ๋„ ์ด ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์„ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์ผ๋‹ค.

 

 

4. ์ธ๋ฒคํ† ๋ฆฌ ์„ธํŒ…ํ•˜๊ธฐ

์•„์ดํ…œ์€ ์—ฌ๋Ÿฌ์ข…๋ฅ˜๋‹ˆ๊นŒ! ์ธ๋ฑ์Šค ๋ฒ„ํŠผ๊ณผ

์Šฌ๋กฏ์ด ๋“ค์–ด๊ฐˆ ๋ฐ•์Šค๋ฅผ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ฐ•์Šค ์•ˆ์— ์•„์ดํ…œ ์Šฌ๋กฏ๋“ค์ด ๋“ค์–ด๊ฐˆ ์ž๋ฆฌ์ธ Scroll View๋ฅผ ๋งŒ๋“ ๋‹ค.

์Šคํฌ๋กค ๋ทฐ ์‚ฌ์ด์ฆˆ ์กฐ์ ˆํ•˜๋Š” ๊ฒŒ ๋จธ๋ฆฌ ์•„ํ”ˆ๋ฐ

๊ตฌ๊ธ€๋ง ํ•˜์…”์„œ ์ž˜ ๋งž์ถฐ๋ณด์„ธ์š”

 

content๊นŒ์ง€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Scroll View๋ฅผ ๋งŒ๋“ค๋ฉด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ธ๋ฐ

์ € content ๋ฐ‘ slot์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋†“์€ ์•„์ดํ…œ ์Šฌ๋กฏ๋“ค์ด ๋“ค์–ด๊ฐˆ ์˜ˆ์ •์ด๋‹ค.

slot์€ grid layout์œผ๋กœ ๋˜์–ด์žˆ์–ด ๋“ค์–ด๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

 

์šฐ๋ฆฌ๋Š” ์ธ๋ฒคํ† ๋ฆฌ๋ฅผ

๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋†“์€ ์•„์ดํ…œ ์Šฌ๋กฏ๋“ค ์ค‘

์ธ๋ฒคํ† ๋ฆฌ ํ™”๋ฉด์— ๋“ค์–ด์™€์•ผ ํ•˜๋Š” ๊ฒƒ๋งŒ

SetParent๋ฅผ ์ด์šฉํ•ด slot ๋ฐ‘์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ทธ๋Ÿผ ์•„์ดํ…œ ์Šฌ๋กฏ๋“ค์„ ๋งŒ๋“ค์–ด ๋ณด์ž!

 

5. ์•„์ดํ…œ Object ์„ค์ •

๋ชจ๋“  ์•„์ดํ…œ์„ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋งŒ๋“ค์–ด๋†“๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋ณด๊ธฐ ์ข‹๊ฒŒ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„๋กœ ๋ฌถ๋Š”๋‹ค.

ํ•œ ์•„์ดํ…œ ์˜ค๋ธŒ์ ํŠธ ์•ˆ์—๋Š”

  • Item id๊ฐ€ ์žˆ๋Š” ItemInfo ์Šคํฌ๋ฆฝํŠธ,
  • ์•„์ดํ…œ์˜ ์•„์ด์ฝ˜(image๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ),
  • ๋ณด์œ ํ•œ ์•„์ดํ…œ ๊ฐœ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ผ ๋™๊ทธ๋ผ๋ฏธ

๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.

์—ฌ๊ธฐ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜๋Š” ๋ˆ„๋ฅด๋ฉด ์•„์ดํ…œ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฑ™๊ฒจ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค. (์ด ํฌ์ŠคํŒ…์˜ ๋งฅ๋ฝ๊ณผ ๋‹ค๋ฅธ ๋‚ด์šฉ์ด๋‹ˆ ๋ฌด์‹œ ๊ฐ€๋Šฅ)

 

์œ„์น˜๋Š” ํ•œ -1000์ •๋„๋กœ ๋ฉ€๋ฆฌ ๋ฉ€๋ฆฌ ๋ณด๋‚ด์„œ ์šฐ๋ฆฌ ์Šคํฌ๋ฆฐ์—๋งŒ ์•ˆ ๋ณด์ด๊ฒŒ ํ•˜๋„๋ก ํ•œ๋‹ค.

 

์—ฌ๊ธฐ๊นŒ์ง€ ์‚ฌ์ „ ์ค€๋น„ ๋! ๋‹ค์Œ ํฌ์ŠคํŠธ์—์„œ๋Š” ์ธ๋ฒคํ† ๋ฆฌ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.