카테고리 없음

5-20 TIL 스크립터블 오브젝트

bugmin 2024. 5. 20. 23:52

스크립터블 오브젝트 (ScriptableObject) 

 

스테이지 별로 나오는 몬스터 프리펩을 등록해두면 편하지 않을까? 

아니면 오브젝트나 컴포넌트들을 등록해두고 바로바로 쓸 수 있는 읽기 용도의 컨테이너가 있으면 어떨까

 

데이터를 저장하고 관리를 유연하게 해주는 데이터 컨테이너의 역할을 하는 것이 스크립터블 오브젝트이다.

 

또한 A 몬스터가 100마리가 있는데 전부 같은 정보를 가지고 있다면 메모리 낭비가 심해진다. 공통의 정보라면 참조를 통해 메모리 절약을 할 수 있지 않을까?

 

이또한 스크립터블 오브젝트서 가능하다. 하나의 스크립터블 오브젝트를 여러 게임 오브젝트에서 참조하여 재사용 가능하다.

 

다만 스크립터블 오브젝트를 사용하기 위해서는 ScriptableObject 클래스를 상속받아 사용해야한다.

 

사용 예시

[CreateAssetMenu(fileName = "DefaultAttackSO", menuName = "TopDownController/Attacks/Default", order = 0)] //포맷을 지켜주면 좋다
public class AttackSO : ScriptableObject //ScriptableObject를 사용하기 위해선 ScriptableObject를 상속해야함
{
    [Header("Attack Info")] //인스팩터 창에서 관리의 편의를 위해 헤드를 붙이는거임, 인스팩터 창에 헤더가 나오게 된다.
    public float size;
    public float delay;
    public float power;
    public float speed;
    public LayerMask target;

    [Header("Knock Back Info")]
    public bool isOnKnockBack;
    public float knockbackPower;
    public float knockbackTime; 
}

 

이런식으로 작성해줄 수 있다.

 

맨 위에 있는 CreateAssetMenu 의 경우 포맷을 지켜주는 것이 좋다. 그래서 저게 어디에 적용되는 가라고 물으면

 

 

프로젝트 뷰에서 Create로 SO를 생성시에 메뉴를 만들어주는 거라 보면 된다.

 

menuName에 따라 TopDownController -> Attacks -> Default 로 찾아갈 수 있고

 

order가 0이라 Default가 처음에 오는 모습이다.

 

저렇게 파일을 만들게 되면 

 

 

fileName으로 설정한 이름이 기본 값으로 들어가있음을 알 수 있다.

 

헤더의 경우엔 인스팩터 창에서 관리를 용이하게 하기 위해 붙인 것으로 SO와 연관 있는 내용은 아니지만 알아두면 좋을 듯하다.

 

좀 더 이것을 왜 써야하며 어떤 식으로 활용되는가에 대해서는 차후 TIL에 공부 후에 작성할 예정이다.