๊ฒŒ์ž„์˜ ์Šคํ‚ฌ์ด ๋‹จ์ˆœํžˆ ์ˆ˜์น˜๋งŒ ๋‹ค๋ฅธ ํ˜•์‹์ด ์•„๋‹ˆ๋ผ ๊ฐ ์Šคํ‚ฌ ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๋™์ž‘์ด ํ•„์š”ํ•ด์„œ 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) => {});
}
}