๊ฒ์์ ์คํฌ์ด ๋จ์ํ ์์น๋ง ๋ค๋ฅธ ํ์์ด ์๋๋ผ ๊ฐ ์คํฌ ๋ง๋ค ๊ณ ์ ํ ๋์์ด ํ์ํด์ scriptable object๋ก ๊ตฌํํ๋๋ฐ์
base skill์ abstract๋ก ๊ตฌํํ๊ณ ์ด๋ฅผ ์์๋ฐ๋ ์์ ์คํฌ๋ค์ ๋ง๋ค์์ด์.
์คํฌ ๊ตฌํ์ด ๋๋์ ์ ์ฒด ์คํฌ ๋ฐ์ดํฐ๋ฅผ ์ข๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ฒ
ํ๋ ์ดํน์ json์ผ๋ก ์ ์ฅํ๊ณ ๊ฒ์์ ์์ํ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ค๊ณ ํ๋๋ฐ์
๊ฐ ํ๋๋ฅผ json์ผ๋ก serialize ํ๋๊ฑด ์ ๋๋๋ฐ ์ด๊ฑธ ๋ถ๋ฌ์ค๋๊ฑธ ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
base skill์ด abstract ํ์์ด๊ณ ์์ ํด๋์ค์์๋ง ์ ์ธ๋ ๋ณ์๋ ์์ด์
base ํด๋์ค๋ฅผ ์ง์ instance ๊ตฌํํ ์๊ฐ ์์ต๋๋ค.
๊ทธ๋์ JsonConvert.DeserializeObject<T>๋ ScriptableOjbect.CreateInstance<T>๋ก ๊ฐ ์คํฌ ๋ง๋ค ์ ๋ค๋ฆญ ํ์์ ์
๋ ฅํด์ค์ผ ํ๋๋ฐ
์ด๋ฌ๋ฉด ์ ์ฒด ์คํฌ์ ์ผ์ผ์ด ์
๋ ฅํด์ค์ผ ํ๋๋ผ๊ตฌ์.
ํน์ ์ ๋ค๋ฆญ T๋ฅผ ๋ฆฌํ๋ ์
์ ์ด์ฉํด์ Type ๋ณ์์ฒ๋ผ ์
๋ ฅํ๋ ๋ฐฉ๋ฒ์ด ์์๊น์?
์๋๋ ๊ฐ๋จํ๊ฒ ์ฝ๋๋ก ์ ๋ฆฌํ ๋ด์ฉ์
๋๋ค
public abstract class SkillBase : ScriptableObject
{
//๊ณตํต ๋ณ์
public string Name {get; protected set;}
public float Value {get; protected set;}
public virtual void Action() {}
}
public class FireBall : SkillBase
{
public override void Action()
{
float fireDotDamage; //ํด๋น ์คํฌ์๋ง ์ฌ์ฉ๋๋ ๋ณ์
//๊ณ ์ ํ ๋์ ์ ์
}
}
public class DataManager()
{
void GetUserData(string myPlayFabId)
{
PlayFabClientAPI.GetUserData(new GetUserDataRequest(){},
result =>
{
if (result.Data == null || !result.Data.ContainsKey("Skill")) Debug.Log("No skill");
else
{
//playFab์ผ๋ก ๋ถํฐ json์ ๋ถ๋ฌ์ ๊ณตํต ๋ณ์๋ฅผ ๋ฐ์ ๊ฐ ์คํฌ์ Instance์ ์
๋ ฅํ๋ค..
List<SkillBase> skills = JsonConvert.DeserializeObject<List<SkillBase>>(result.Data["Skill"].Value);
var fireBall = ScriptableObject.CreateInstance<FireBall>();
var waterBall = ScriptableObject.CreateInstance<WaterBall>();
var lightening = ScriptableObject.CreateInstance<Lightening>();
//CreateInstance<T> ์ T ๋ถ๋ถ์ ๋ชจ๋ ์คํฌ์ ๋ํด์ ์
๋ ฅํด์ผ ํ๋ค.
//CreateInstance<skills[index].Name> ์ฒ๋ผ T๋ฅผ ๋ณ์ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง?
//CreateInstance(Type.GetType(skills[index].Name)๋ก ํด๋ object type์ผ๋ก ๋ฐํ๋๋ฏ๋ก ์ฌ์ฉํ ์ ์์?
}
},
(error) => {});
}
}
๊ทธ๋ฅ c# generic reflection์ผ๋ก ๊ฒ์ ใฑ
๋ญ ํ๊ณ ์ถ์๊ฑด์ง ์ฝ๋์กฐ๊ฐ์ ์ฒจ๋ถํ๋ํธ์ด ์ข์๋ฏ
1. ์ ์ฝ๋์์๋ ScriptableObject๋ฅผ ์ฐ๋๊ฐ, json์ ์ฐ๋๊ฐ ๋ ์ค ํ๋๋ง ํด์ผํ๋ค 2. ScriptableObject ์ธ๊ฑฐ๋ฉด SkillBase์์ name์ด๋ value๋ ์ง๋ ฌํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค์(ํ๋ ๋ง๋ค๊ณ SerializeField ๋ถ์ด๋์ง public ํ๋๋ก ๋ง๋ค๋์ง) [CreateAssetMenu()] class SkillDB : ScriptableObject { public SkillBase[] Skills; } ์์ฒ๋ผ ๋ง๋ค๊ณ SkillDB ์์ ๋ง๋ค๊ณ , ์คํฌ๋ค ์กฐ๋ฆฝํด ๋ฃ์๋ค์์ DataManager์์ CreateInstance()๋ง ํด์ค๋ ์ถฉ๋ถํ๋ค
CreateInstance()ํ๋ฉด ๋น๊ฑฐ ๋์ค๊ฒ ๋ค. ์๋ชป๋งํจ. Resources.Load๊ฐ์๊ฑฐ๋ก ์ง์ ๋ก๋ํ๋๊ฐ ํ๋๊ฐ ์ฌ์ ๋ฏธ๋ฆฌ ๋ฐ์๋ฃ๋๊ฐ ํด์ ๋ง๋ค์ด๋์๊ฑฐ ๊ฐ์ ธ์์ผ๋จ
3. json์ธ๊ฑฐ๋ฉด ์ผ๋จ ScriptableObject๋ ๋นผ์ผํ๋ค.
3.1. ์คํฌ์ด๋ฆ๋ง json์ ์ ์ฅํ ๊ฑฐ๋ฉด ์์ฒ๋ผ ์ผ์ผ์ด ํ๋์ฝ๋ฉํด์ ์ด๋ฆ๋ง๋ค new XXSkill() ํด์ฃผ๋ฉด ๋๊ณ
3.2 ๋คํ์ฑ์ ๋ฐ๋ก ๋ณต๊ตฌํ ๊ฑฐ๋ฉด JsonConvert.Deserializeํ ๋ TypeNameHandling์ ์ผ์ค์ผ ํ๋ค. (
https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm)
3.3
์๋๋ฉด ํ์ ๋ช ์ ๋ฐ๋ก ์ ์ฅํด๋๋ค์ C# ๋ฆฌํ๋ ์ ์จ์ Activator.createinstance()๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค
์๋ฒ์์ ๋ฐ์์ค๋ ๊ฐ ํด์ผํด์ ๋ฐ๋์ json ์จ์ผํ๋๊ฑฐ ์๋๋ฉด 2๋ฒ์ด ์ ์ผ ์ฌ์ด ๊ธธ์.
์์ธํ ๋ต๋ณ ๊ฐ์ฌํฉ๋๋ค ๋์น๊ณ ์๋๊ฒ ๋ง์์๋ค์ ์์ ํด๋ณด๊ฒ ์ต๋๋ค ใ ใ