ScriptableObject 만들기
[CreateAssetMenu(fileName = "AttackSO", menuName = "Project/attacks/default", order = 2)]
public class AttackSO : ScriptableObject
{
[Header("characterInfo")]
public float hp;
public float speed;
public float power;
public LayerMask target;
}
스크리터블 오브젝트는 유니티에서 데이터를 저장하고 관리하는 유연한 데이터 컨테이너이다.
공통된 부분을 SO로 사용하여 다른 캐릭터에도, 여러 오브젝트에 재사용하는 등 사용할 수 있다.
enum
enum은 열거형을 말한다. 보통 상태나 값을 나타낼 때 사용된다.
public enum States
{
Idle, //각각에 정수가 매핑되어있다
Walking = 100, //이렇게 하면 뒤에 Running은 101부터 시작
Running
}
게임에서 상태를 표시할 때, 위처럼 사용할 수 있다. 이어서 가면 switch case로
case(states.Idle)이런식으로 사용할 수 있다.
Virtual / Override
Virtual은 메소드를 선언할 때 접근제한자 뒤에 붙는다. Virtual은 override와 함께 사용되는데, 부모 클래스에 메소드를 자식 클래스에서 오버라이딩해서 사용된다.(덮어쓰기 같은 느낌)
오버라이딩하지 않는다면 부모클래스에 있는 메소드가 호출 될 것이고, 자식클래스에서 오버라이딩한다면 최종적으로 자식클래스에 메소드가 호출될 것이다.
Virtual과 비슷한 Abstract는 구현부가 없고, 반드시 자식클래스에서 메소드를 구현해야만 한다.
하지만 virtual은 구현부가 있고, 추가적으로 override해도 되고 않해도 되는 구조이다.
예시를 보자.
//부모클래스
protected virtual void Awake()
{
stats = GetComponent<CharacterStatHandler>();
}
//자식클래스
protected override void Awake()
{
base.Awake();
camera = Camera.main; //
}
위에서 구현된 것처럼, 부모클래스의 Awake메소드에 Virtual을 해주고, stats라는 컴포넌트를 가져왔다.
자식클래스에서 stats라는 컴포넌트가 필요하고(base.Awake();), 추가적인 부분이 필요해 camera = Camera.main;이라는 구현부를 추가해준 모습이다.
이로써 자식클래스에서는 base를 통해 부모에 메소드를 가져오고, override를 통해 추가적인 구현도 추가할 수 있었다.