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;
    }
}

다음과 같이 인스펙터창에서 세팅이 가능하다.