240125-TIL

2024. 1. 25. 21:10내일배움캠프

1월 25일

 

오늘은 Unity의 ScriptableObject에 대해서 정리해 보도록 하겠다.

 

  • ScriptableObject

유니티 오브젝트를 상속받은 클래스로 Unity 시리얼 라이즈 시스템을 가지고 있다.

 

유니티에서 기본적으로 C# 스크립트를 하나 만들게 되면 MonoBehaviour을 상속받고있는데

 

MonoBehaviour과의 차이점이라고 한다면?

 

ScriptableObject는 유니티 콜백 중OnEnable, Ondisable, OnDestroy 3가지만 받는다고 한다. 

 

각각 정리해보자면 

 

  • OnEnable

ScriptableObject이 instantiated / loaded 될때 ScriptableObject.CreateInstance() 함수 호출 시,

에디터에서 스크립트가 컴파일 된 후에 호출

 

  • Ondisable

ScriptableObject이 파괴되기 전에 호출, 에디터에서 스크립트가 컴파일 되기 전에 호출

 

  • OnDestry

ScriptableObject이 파괴 될때

 

ScriptableObject는 데이터 컨테이너로 데이터 공유에 사용할 수 있고, 이를 통해 메모리 사용량을 줄일 수 있다

 

 

ScriptableObject의 활용?

 

https://unity.com/how-to/architect-game-code-scriptable-objects

 

|

Keep your code flexible, manageable, and easy to debug by architecting with ScriptableObjects.

unity.com

 

ScriptableObject의 활용은 Unity 사이트에서도 둘러볼수있다.

 

ScriptableObject는 스크립트 인스턴스와 별도로 대량의 공유 데이터를 저장할 수 있는 직렬화 가능한 Unity 클래스입니

다. ScriptableObjects를 사용하면 변경 사항 관리 및 디버깅이 더 쉬워집니다.

 

라고 ScriptableObject를 홍보하고 있으며

 

 

이렇게 플레이어의 체력 포인트를 예시로

 

단일 로컬 플레이어가 있는 게임에서 플레이어의 HP는 PlayerHP라는 FloatVariable이 될 수 있습니다. 

플레이어가 피해를 입으면 PlayerHP에서 차감되고 플레이어가 치료하면 PlayerHP에 추가됩니다.

이제 장면에 체력 막대 Prefab이 있다고 상상해 보세요. 체력 표시줄은 PlayerHP 변수를 모니터링하여 디스플레이를 업데이트합니다. 코드를 변경하지 않으면 PlayerMP 변수와 같은 다른 것을 쉽게 가리킬 수 있습니다. 체력 표시줄은 장면의 플레이어에 대해 아무것도 알지 못하며 플레이어가 쓰는 것과 동일한 변수에서 읽을 뿐입니다.

이렇게 설정하고 나면 PlayerHP를 시청하기 위해 더 많은 항목을 추가하기가 쉽습니다. PlayerHP가 낮아짐에 따라 음악 시스템이 변경될 수 있고, 적들은 플레이어가 약하다는 것을 알 때 공격 패턴을 변경할 수 있으며, 화면 공간 효과는 다음 공격의 위험을 강조할 수 있습니다. 여기서 핵심은 플레이어 스크립트가 이러한 시스템에 메시지를 보내지 않으며 이러한 시스템이 플레이어 GameObject에 대해 알 필요가 없다는 것입니다. 게임이 실행 중일 때 Inspector로 가서 PlayerHP의 값을 변경하여 테스트할 수도 있습니다. 

FloatVariable의 값을 편집할 때 ScriptableObject에 대해 디스크에 저장된 값을 변경하지 않도록 데이터를 런타임 값으로 복사하는 것이 좋습니다. 이렇게 하면 MonoBehaviour는 RuntimeValue에 액세스하여 디스크에 저장된 초기 값을 편집하지 못하게 해야 합니다.

 

라고 설명하고 있다.

 

다음은 ScriptableObject를 생성하는 방법을 알아보자.

생성방법

더보기

 

[CreateAssetMenu(fileName = "New HeroData", menuName = "Sword HeroData", order = 2)]

public class test : ScriptableObject

{

 

}

유니티에서 스크립트를 생성하면 Monobehaviour를 자동으로 상속 받게 되는데 지우고

ScriptableObject를 상속받아온다.

 

[CreateAssetMenu] : 없어도 되지만 있으면 편함

fileName : 새로 제작하게되면 임시로 생성된다. 

menuName : 유니티 메뉴에 표기되는 이름

order : 메뉴에서 보일 순서

 

 

 

Assets -> Create 보면 방금 생성한 HeroData가 보이게 된다.

 

SerializeField의 원본 데이터들은 수정되면 안되기 때문에 

데이터 값을 받을 게터를 public으로 추가해준다.

public class test : ScriptableObject

{

    [SerializeField]

    string heroName;

    [SerializeField]

    string description;

    [SerializeField]

    int goldCost;

 

    public string sName => heroName;

    public string sDesc => description;

    public int    nCoin => goldCost;

}

 

사용법

데이터 값 입력

 

 

ScriptableObject를 받을 코드 작성

public class Scene : MonoBehaviour

{

    public Text m_txtUI;

    public test m_Data;

    void Start()

    {

        m_txtUI.text = string.Format(m_Data.sName + " // " + m_Data.sDesc);

    }

}

Data 매칭 인스펙터 창에서 끌어다 놓는다

 

 

출처 : https://funfunhanblog.tistory.com/81

 

오늘은 ScriptableObject에 대해서 간략하게 정리해보았다.

 

아직까지 ScriptableObject를 여러 방면으로 활용하지는 못하지만

 

Unity홈페이지에서 여러방면으로 ScriptableObject를 활용하는 방법에 대해서 알려주고있기 때문에

 

필요할때마다 계속 들어가서 어떤 방식으로 활용할 수 있는지

 

내가 만드려고 하는 게임에 어떤 방식으로 적용시킬수 있는지 열심히 공부해야겠다.

 

1월 25일 TIL은 여기서 마치도록 하겠다.

'내일배움캠프' 카테고리의 다른 글

240129-TIL  (0) 2024.01.29
240126-TIL  (0) 2024.01.26
240124-TIL  (0) 2024.01.24
240123-TIL  (0) 2024.01.23
240122-TIL  (0) 2024.01.22