스크립터블 오브젝트 (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에 공부 후에 작성할 예정이다.