์คํฌ๋ฆฝํฐ๋ธ ์ค๋ธ์ ํธ(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 ์์ฑ์ ์ฌ์ฉํ๋ฉด ๋์ฑ ๊ฐํธํ๊ฒ ์ปค์คํ ์์ ์ ์์ฑํ ์ ์๋ค.
์์ฑ๋ ScriptableObject ์ธ์คํด์ค๋ฅผ ํด๋ฆญํ๋ฉด ์ธ์คํํฐ ๋ทฐ์์ Zombie Data์ ๋ํ ํ๋กํผํฐ๋ค์ ํ์ธํ ์ ์๋ค.
3. ์ฌ์ฉ
ScriptableObject ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์์ผ๋ ๊ฐ๊ฐ ๋ค๋ฅธ ํน์ง์ ๊ฐ์ง ์ข๋น๋ค์ ์ ์ํ ๊ฒ์ด๋ค. ์ ScriptableObject ์ธ์คํด์ค๋ค์ ์๋์ ๋ง๊ฒ ์ด๋ฆ๋ ๋ณ๊ฒฝํ๊ณ ๊ฐ๋ ์ค์ ํ๋ฉด ๋๋ค.
์ด๋ฌํ ๊ฐ์ ์ฌ์ฉํ๋ ค๋ฉด 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 ๋ฐ์ดํฐ๊ฐ ์๋ฏธ ์๋ ๋๋ ํ๋์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๊ฒฝ์ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ ์ ํ์ฉํ๋ ค๋ฉด ๊ฐ์ ํ๋ฆฌํน์ ์ฌ๋ฌ ๊ฐ ์์ฑํ๋ฉด ๋๋ค.
4. ์ฐธ์กฐ
https://docs.unity3d.com/kr/2020.2/Manual/class-ScriptableObject.html