๋ฐ˜์‘ํ˜•

โœ… ScriptableObject๋ž€?

๐Ÿ“Œ ๊ฐœ๋… ์ •๋ฆฌ

  • ScriptableObject๋Š” MonoBehaviour์ฒ˜๋Ÿผ Unity์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํด๋ž˜์Šค์ง€๋งŒ,
  • ์”ฌ์— ๋ถ™๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๊ณ , ๋…๋ฆฝ์ ์ธ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์•ผ.
  • ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‚ฐ(Asset)์œผ๋กœ ๋งŒ๋“ค์–ด ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•ด.

โœ… ์–ธ์ œ ์‚ฌ์šฉํ•˜๋‚˜์š”?

์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์˜ˆ: ์Šคํƒฏ, ์„ค์ •๊ฐ’, ์•„์ดํ…œ ์ •๋ณด ๋“ฑ
ํ”„๋ฆฌํŒน์ด๋‚˜ ์ฝ”๋“œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์„ค์ • ๋ณ€๊ฒฝ์ด ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ ํŽธํ•จ
์ธ์ŠคํŽ™ํ„ฐ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ ์ž…๋ ฅํ•˜๊ณ  ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ปค์Šคํ…€ ์—๋””ํ„ฐ ์—ฐ๋™๋„ ์‰ฌ์›€

โœ… ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ: ์บ๋ฆญํ„ฐ ๋Šฅ๋ ฅ์น˜ ๋ฐ์ดํ„ฐ ๋งŒ๋“ค๊ธฐ

1. CharacterStats.cs

using UnityEngine;

[CreateAssetMenu(fileName = "NewCharacterStats", menuName = "ScriptableObjects/CharacterStats")]
public class CharacterStats : ScriptableObject
{
    public string characterName;
    public int maxHP;
    public int attackPower;
    public float moveSpeed;
}

2. ์ƒ์„ฑ ๋ฐฉ๋ฒ•

  • Unity ์—๋””ํ„ฐ์—์„œ ์šฐํด๋ฆญ → Create → ScriptableObjects → CharacterStats
  • ์ด๋ฆ„์„ WarriorStats, MageStats ๋“ฑ์œผ๋กœ ์ง€์ •ํ•˜๊ณ  ๊ฐ’ ์ž…๋ ฅ

3. ์‚ฌ์šฉํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ

public class Player : MonoBehaviour
{
    public CharacterStats stats;

    private void Start()
    {
        Debug.Log($"{stats.characterName}์˜ ๊ณต๊ฒฉ๋ ฅ: {stats.attackPower}");
    }
}
  • Player ์˜ค๋ธŒ์ ํŠธ์— ๋ถ™์ด๊ณ , stats ํ•„๋“œ์— ScriptableObject ์ž์‚ฐ์„ ํ• ๋‹นํ•˜๋ฉด ๋!

โœ… ScriptableObject vs MonoBehaviour

์”ฌ์— ์กด์žฌ โŒ (์”ฌ์— ์•ˆ ๋ถ™์Œ) โœ… (์˜ค๋ธŒ์ ํŠธ์— ๋ถ™์ž„)
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ โœ… ๋งค์šฐ ์ข‹์Œ โŒ ๋ฐ˜๋ณต ์‚ฌ์šฉ ์‹œ ๋น„ํšจ์œจ
์—ญํ•  ๋ฐ์ดํ„ฐ ์ €์žฅ, ์„ค์ • ๋™์ž‘ ๋กœ์ง, ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
์žฌ์‚ฌ์šฉ ์—ฌ๋Ÿฌ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ฐธ์กฐ ๊ฐ€๋Šฅ ์˜ค๋ธŒ์ ํŠธ๋งˆ๋‹ค ๊ฐœ๋ณ„

 


โœ… ์žฅ์  ์ •๋ฆฌ

  • โœ”๏ธ ์”ฌ ๋…๋ฆฝ์  ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ (๊ฒŒ์ž„ ๋ฐธ๋Ÿฐ์Šค ์กฐ์ • ์‹œ ์œ ๋ฆฌ)
  • โœ”๏ธ ํ”„๋ฆฌํŒน ์žฌ์‚ฌ์šฉ ์‹œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ
  • โœ”๏ธ ๋ฒ„์ „ ๊ด€๋ฆฌ์— ์œ ๋ฆฌ (๋ฐ์ดํ„ฐ๊ฐ€ ํŒŒ์ผ๋กœ ์กด์žฌํ•˜๋‹ˆ๊นŒ Git์—๋„ ๋”ฑ!)
  • โœ”๏ธ ์œ ๋‹› ํ…Œ์ŠคํŠธ์— ์ ํ•ฉ

โœ… ๋‹จ์  or ์ฃผ์˜์‚ฌํ•ญ

  • ScriptableObject๋Š” **์ƒํƒœ(state)**๋ฅผ ์ €์žฅํ•˜๊ธฐ๋ณด๋‹จ ์„ค์ •๊ฐ’(config) ์ €์žฅ์— ์ ํ•ฉํ•จ
  • ๋Ÿฐํƒ€์ž„์— ๊ฐ’์„ ๋ฐ”๊พธ๋ฉด ์—๋””ํ„ฐ์— ์ €์žฅ๋œ ์ž์‚ฐ์ด ์ˆ˜์ •๋  ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜

โœ… ์‹ค์ƒํ™œ ๋น„์œ 

  • MonoBehaviour๋Š” "๊ฒŒ์ž„์— ๋‚˜์˜ค๋Š” ๋ฐฐ์šฐ(์˜ค๋ธŒ์ ํŠธ)"
  • ScriptableObject๋Š” "๊ทธ ๋ฐฐ์šฐ๊ฐ€ ์ฐธ๊ณ ํ•˜๋Š” ๋Œ€๋ณธ(๋ฐ์ดํ„ฐ)"

์œผ์Œ ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜๋Š”๊ฒƒ์€ ๋„ˆ๋ฌด ์ข‹์•„๋ณด์ธ๋‹ค ์ฒ˜์Œ ์ด๊ฑธ ๋ดค์„๋•Œ ์™œ ์ด๊ฑธ ๋ชฐ๋ž์„๊นŒ? ์‹ถ์—ˆ๋‹ค ์—„์ฒญ ์œ ์šฉํ•˜๊ฒŒ ๋งŽ์ด ์‚ฌ์šฉ๋ ๋“ฏํ•˜๋‹ค ๋ณดํ†ต ์ธ๋ฒคํ† ๋ฆฌ ์‹œ์Šคํ…œ์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š”๊ฑฐ ๊ฐ™๋‹ค ์Šคํ‚ฌ/์•„์ดํ…œ ๋ฐ์ดํ„ฐ๋“ฑ๋“ฑ..

๊ฐ„๋‹จํ•˜๊ฒŒ ์œ ๋‹ˆํ‹ฐ๋กœ ๋ญ๋ผ๋„ ๋งŒ๋“ค์–ด ๋ณด์ž!

 

๋Œ€์ถฉ ์š”์•ฝํ•˜์ž๋ฉด

๐Ÿ“ฆ ์ „์ฒด ๊ตฌ์„ฑ ์š”์•ฝ

1. ScriptableObject ๊ธฐ๋ฐ˜ ์•„์ดํ…œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

  • Item_ScriptableObject ํด๋ž˜์Šค ์ƒ์„ฑ
  • ์ธ์ŠคํŽ™ํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์•„์ดํ…œ ๋ฐ์ดํ„ฐ๋ฅผ .asset ํŒŒ์ผ๋กœ ์ƒ์„ฑ (ItemData1~4)
  • ๊ฐ ์•„์ดํ…œ์€ ๊ณ ์œ  ๋ฒˆํ˜ธ, ์ด๋ฆ„, ์„ค๋ช…, ํŒŒ์›Œ ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง

2. ์•„์ดํ…œ ์˜ค๋ธŒ์ ํŠธ (Item)

  • ItemObject ์Šคํฌ๋ฆฝํŠธ ๋ถ€์ฐฉ
  • ๊ฐ๊ฐ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ํ•˜๋‚˜์˜ ScriptableObject ์ฐธ์กฐ
  • Tag๋Š” "Item"์œผ๋กœ ์ง€์ •

3. ํ”Œ๋ ˆ์ด์–ด

  • WASD ํ‚ค ์ž…๋ ฅ์œผ๋กœ 2D ์ด๋™
  • Rigidbody2D + Collider2D ๊ตฌ์„ฑ
  • Item๊ณผ ์ถฉ๋Œ ์‹œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํš๋“

4. UI ์‹œ์Šคํ…œ

  • ItemUIManager ์Šคํฌ๋ฆฝํŠธ๋กœ Text ์ปดํฌ๋„ŒํŠธ ์ œ์–ด
  • ์•„์ดํ…œ ์ •๋ณด ํ‘œ์‹œ ๋ฐ ์ดˆ๊ธฐํ™” ๋‹ด๋‹น

ํ ..๊ทผ๋ฐ ์‚ฌ์‹ค ๊ณ ์œ  ๋ฒˆํ˜ธ๋Š” ํ•„์š” ์—†์—ˆ์„๊ฑฐ๊ฐ™๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์•„์ดํ…œ ์ •๋ณด๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉํ• ์ˆ˜์žˆ๋Š”๊ฑธ ์•Œ๊ฒŒ๋๋‹ค!

 

๋‚˜๋จธ์ง€ ์ฝ”๋“œ

Item_ScriptableObject.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName ="ItemData", menuName = "ScriptableObject/ItemData")]
public class Item_ScriptableObject : ScriptableObject
{
    public int itemNum;
    public string itemName;
    public string iteminfo;
    public int itemPower;
}

ItemObject.cs - ์•„์ดํ…œ์— ๋“ค์–ด๊ฐ€๋Š” ์Šคํฌ๋ฆฝํŠธ - Tag Item์œผ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•œ๋‹ค.

using UnityEngine;

public class ItemObject : MonoBehaviour
{
    public Item_ScriptableObject itemData;
}

ItemUIManager.cs ์ด๋‹ค ์—ฌ๊ธฐ์„œ ์•„์ดํ…œ์˜ ์„ค๋ช…๊ณผ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ

using UnityEngine;
using UnityEngine.UI;

public class ItemUIManager : MonoBehaviour
{
    public Text nameText;
    public Text infoText;
    public Text powerText;
    public GameObject panel;

    private void Start()
    {
        panel.SetActive(false);
    }

    public void ShowItemInfo(Item_ScriptableObject item)
    {
        panel.SetActive(true);
        nameText.text = $"์ด๋ฆ„: {item.itemName}";
        infoText.text = $"์„ค๋ช…: {item.iteminfo}";
        powerText.text = $"ํŒŒ์›Œ: {item.itemPower}";
    }

    public void HideInfo()
    {
        panel.SetActive(false);
        nameText.text = "";
        infoText.text = "";
        powerText.text = "";
    }
}

Player.cs ์ด๋‹ค. Item๊ณผ ๋‹ฟ๋Š”๋‹ค๋ฉด UI๋งค๋‹ˆ์ €๋ฅผ ์ด์šฉํ•ด์„œ ์•„์ดํ…œ์˜ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.

using UnityEngine;

public class Player : MonoBehaviour
{
    public ItemUIManager uiManager;

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Item"))
        {
            ItemObject itemObj = other.GetComponent<ItemObject>();
            if (itemObj != null && itemObj.itemData != null)
            {
                uiManager.ShowItemInfo(itemObj.itemData);
            }
        }
    }

    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.CompareTag("Item"))
        {
            uiManager.HideInfo();
        }
    }
}

 

๋‚˜๋จธ์ง€ ์ฝ”๋“œ 1๊ฐœ๋Š” PlayerMovement์ธ๋ฐ ๊ฐ„๋‹จํ•˜๋‹ˆ๊นŒ ๋„˜์–ด๊ฐ€๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•