C#
ScriptableObject
khkg12
2023. 9. 8. 17:11
ScriptableObject는 유니티에서 제공해주는 데이터 컨테이너이다. 데이터 영역에 할당되며 [CreateAssetMenu]란 어트리뷰트를 통해 생성할 수 있다. 데이터 영역에 할당되어 있는 놈이기 때문에 여러 개의 사본을 생성하지 않고 하나의 데이터를 사용하는 경우에 유용하다.
사용예시
나는 ScriptableObject를 이용해 스킬 구조를 짰었다. ScriptableObject는 직렬화 및 역직렬화가 가능하기 때문에 따로[System.Searizable] 어트리뷰트를 붙여주지 않아도 인스펙터 창을 통해 변수들을 확인할 수 있다. 그래서 스킬 So는 스킬이미지, 스킬옵션, 스킬오브젝트를 가지고 있고 미리 세팅을 해두어 사용하였다.
또한 데이터영역에 존재하기 때문에 동일한 스킬을 사용하는 유닛이 여러명일 경우 그 스킬의 값이 변경될 시, 그 스킬을 참조하고 있는 모든 유닛의 스킬의 값이 변경되는 거나 마찬가지이기 때문에 이 점을 유의해서 사용했다.
코드부분
[CreateAssetMenu]
public class Skill : ScriptableObject
{
public Sprite skillImage;
public string skillOption;
public string skillDamageText;
public GameObject skillObj;
public virtual int UseSkill(GameObject tower)
{
return tower.GetComponent<Tower>().status.atk;
}
public virtual int UseSkill( Status towerSt )
{
towerSt.mp = 0;
return towerSt.atk;
}
public virtual void UseSkill( Soldier attacker , Vector3 targetPos , GameObject instantObj)
{
}
public virtual void UseSkill(Vector3 targetPos)
{
return;
}
public virtual void UseSkill(Soldier attacker, Monster target)
{
return;
}
public virtual void UseSkill(Soldier attacker, Monster target, GameObject instantObj)
{
return;
}
// 현재 스킬이 쿨타임에 들어가 있거나, 혹은 마나가 부족한지 체크
public virtual bool IsUseSkill( Status towerSt)
{
if (towerSt.maxMp == towerSt.mp)
{
return true;
}
return false;
}
}