[Unity] ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Object)

2022. 6. 1. 20:15ยท๐Ÿ“ Game/โœ Unity

์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Object)

 

1. ์ •์˜

ScriptableObject๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€๋Š” ๋ณ„๋„๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

 

์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ’์˜ ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์—ฐ๊ฒฐ๋œ MonoBehaviour ์Šคํฌ๋ฆฝํŠธ์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ”„๋ฆฌํŒน์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค. ์ด๋Ÿฌํ•œ ํ”„๋ฆฌํŒน์„ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ž์ฒด ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋ฐฉ์‹ ๋Œ€์‹  ScriptableObject๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด ๋ชจ๋“  ํ”„๋ฆฌํŒน์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ ์‚ฌ๋ณธ์„ ํ•˜๋‚˜๋งŒ ์ €์žฅํ•˜๊ฒŒ ๋œ๋‹ค.

 

  • ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์ „ ์œ ๋‹ˆํ‹ฐ ์—๋””ํ„ฐ์—์„œ ์ˆ˜์ • ๋ฐ ์ •์˜๊ฐ€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋นŒ๋“œ๋œ ํ›„์—๋Š” ์ˆ˜์ •ํ•  ์ˆ˜ ์—†๋‹ค.
  • MonoBehaviour์™€ ๋‹ฌ๋ฆฌ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ScriptableObject๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ”„๋กœ์ ํŠธ์˜ ์—์…‹์œผ๋กœ ์ €์žฅ๋œ๋‹ค. ์—์…‹์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์—์…‹ ๋ฒˆ๋“ค๋กœ ๋นŒ๋“œํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฒŒ์ž„ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฒŒ์ž„ ๋นŒ๋“œ์— ํฌํ•จ๋˜๋Š” ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€์กฐํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์‚ฌ์šฉ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

 

2. ์ƒ์„ฑ

๋จผ์ € ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์„ ๋ฐ์ดํ„ฐ๋ฅผ ์ •์˜ํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ScriptableObject ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋„๋ก ํ•ด์•ผ ํ•œ๋‹ค.

 

using UnityEngine;

[CreateAssetMenu(fileName = "Zombie Data", menuName = "Scriptable Object/Zombie Data", order = int.MaxValue)]
public class ZombieData : ScriptableObject
{
    [SerializeField]
    private string zombieName;
    public string ZombieName { get { return zombieName; } }
    [SerializeField]
    private int hp;
    public int Hp { get { return hp; } }
    [SerializeField]
    private int damage;
    public int Damage { get { return damage; } }
    [SerializeField]
    private float sightRange;
    public float SightRange { get { return sightRange; } }
    [SerializeField]
    private float moveSpeed;
    public float MoveSpeed { get { return moveSpeed; } }
}

 

 

์ด๋•Œ CreateAssetMenu ์†์„ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ปค์Šคํ…€ ์—์…‹์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

CreateAssetMenu ์†์„ฑ์œผ๋กœ ์• ์…‹ ์ƒ์„ฑ

 

์ƒ์„ฑ๋œ ScriptableObject ์ธ์Šคํ„ด์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ์ธ์ŠคํŽ™ํ„ฐ ๋ทฐ์—์„œ Zombie Data์— ๋Œ€ํ•œ ํ”„๋กœํผํ‹ฐ๋“ค์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Zombie Data ํ”„๋กœํผํ‹ฐ

 

3. ์‚ฌ์šฉ

ScriptableObject ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•˜์œผ๋‹ˆ ๊ฐ๊ฐ ๋‹ค๋ฅธ ํŠน์ง•์„ ๊ฐ€์ง„ ์ข€๋น„๋“ค์„ ์ •์˜ํ•  ๊ฒƒ์ด๋‹ค. ์ƒˆ ScriptableObject ์ธ์Šคํ„ด์Šค๋“ค์„ ์˜๋„์— ๋งž๊ฒŒ ์ด๋ฆ„๋„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ฐ’๋„ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

์—ฌ๋Ÿฌ Zombie Data ์ƒ์„ฑ

 

์ด๋Ÿฌํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ScriptableObject๋ฅผ ์ฐธ์กฐํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์™€ ๊ทธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์—ฐ๊ฒฐํ•œ ํ”„๋ฆฌํŒน์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

 

public class Zombie : MonoBehaviour
{
    [SerializeField]
    private ZombieData zombieData;
    public ZombieData ZombieData { set { zombieData = value; } }

    public void WatchZombieInfo()
    {
        Debug.Log("์ข€๋น„ ์ด๋ฆ„ :: " + zombieData.ZombieName);
        Debug.Log("์ข€๋น„ ์ฒด๋ ฅ :: " + zombieData.Hp);
        Debug.Log("์ข€๋น„ ๊ณต๊ฒฉ๋ ฅ :: " + zombieData.Damage);
        Debug.Log("์ข€๋น„ ์‹œ์•ผ :: " + zombieData.SightRange);
        Debug.Log("์ข€๋น„ ์ด๋™์†๋„ :: " + zombieData.MoveSpeed);
    }
}

 

Zombie ํ”„๋ฆฌํŒน ๋‚ด zombieData๋Š” ์ƒˆ๋กœ ์„ค์ •ํ•œ ScriptableObject๋กœ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

 

ScriptableObject ๋ฐ์ดํ„ฐ๊ฐ€ ์˜๋ฏธ ์žˆ๋Š” ๋•Œ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒฝ์šฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด ๊ฐ™์€ ํ”„๋ฆฌํŒน์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

Zombie ํ”„๋ฆฌํŒน ์ƒ์„ฑ

 

4. ์ฐธ์กฐ

https://docs.unity3d.com/kr/2020.2/Manual/class-ScriptableObject.html

 

ScriptableObject - Unity ๋งค๋‰ด์–ผ

ScriptableObject๋Š” ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์™€๋Š” ๋ณ„๋„๋กœ ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ScriptableObject์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜๋Š” ๊ฐ’์˜ ์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜

docs.unity3d.com

 

https://wergia.tistory.com/189

 

[Unity3D] Scriptable Object - ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Object) ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

Scriptable Object - ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Object) ๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ• ์ž‘์„ฑ ๊ธฐ์ค€ ๋ฒ„์ „ :: 2019.1 ~ 2019.2 [์ด ํฌ์ŠคํŠธ์˜ ๋‚ด์šฉ์€ ์œ ํŠœ๋ธŒ ์˜์ƒ์œผ๋กœ๋„ ์‹œ์ฒญํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค] ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Ob..

wergia.tistory.com

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)
'๐Ÿ“ Game/โœ Unity' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Unity] Find Reference 2
  • [Unity] ์—์…‹ ๋Ÿฐํƒ€์ž„ ๋กœ๋“œ(๋ฆฌ์†Œ์Šค ํด๋”, ์—์…‹ ๋ฒˆ๋“ค, ์–ด๋“œ๋ ˆ์„œ๋ธ” ์—์…‹)
  • [Unity] Layer์™€ Tag ์‚ฌ์šฉ ๋ฐ ์ฐจ์ด
  • [Unity] Inspector Attribute
Blxxming
Blxxming
CS ์ง€์‹๊ณผ ๊ณต๋ถ€ํ•˜๋‹ค ๋ฐฐ์šด ๊ฒƒ, ๊ฒฝํ—˜ํ•œ ๊ฒƒ ๋“ฑ์„ ๊ธฐ๋กํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
  • Blxxming
    ๐Ÿ’ก๋ฒˆ๋œฉ๐Ÿ’ก
    Blxxming
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
  • ๊ณต์ง€์‚ฌํ•ญ

    • Tech Interview
    • ๐Ÿ“š Tech (246)
      • ๐Ÿ“ Computer Science (96)
        • โœ OS (12)
        • โœ Network & Web (10)
        • โœ Database (11)
        • โœ Data Structure (6)
        • โœ Algorithm (40)
        • โœ Design Pattern (9)
        • โœ Cloud Computing (3)
        • โœ (5)
      • ๐Ÿ“ Language (73)
        • โœ Language (6)
        • โœ C & C++ (11)
        • โœ C# (19)
        • โœ JAVA (37)
      • ๐Ÿ“ Game (43)
        • โœ Computer Graphics (2)
        • โœ Unity (14)
        • โœ Unreal (26)
        • โœ (1)
      • ๐Ÿ“ Book (34)
        • โœ Effective (3)
        • โœ Game Server (16)
        • โœ Clean Code (14)
        • โœ (1)
  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Blxxming
[Unity] ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ(Scriptable Object)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”