2024년 6월 13일 목요일 개발일지 / ScriptableObject에 대해서

2024. 6. 13. 20:44나의 개발자 기록/본 캠프 개발 일지

2024년 6월 13일 목요일


Wha I did today

 

 

오늘은 팀원분들과 인사를 나눈 후, 데일리 스크럼만 작성한 후, 개인 강의를 들었습니다. 저는 어제 파티클에 대한 내용부터 스테이지 로직 강화까지 들었기 때문에 오늘 오전에는 멀티플레이어에 관련해서 듣게 되었습니다. 멀티플레이어는 말 그대로 여러 사람들이랑 같이 할 수 있는 요소라 볼 수 있는데, 멀티플레이어를 알기 위해선 기초적인 네트워크 지식이 있어야 하고, 싱글플레이에서 없었던 버그나 오류들이 발생한다고 합니다. 그래서 알아야 할 내용들이 많고, 이러한 멀티플레이어를 도와주는 백앤드 솔루션도 다양하게 있다고 하네요. 이번 멀티플레이어 강의로 사용한 백엔드 솔루션은 초보자들이 배우기 이만한 게 없다는 Photon Engine이었습니다. 강의를 듣는 내내 코드만 따라치느라 어떤 함수인지는 대충 알겠는데, 정확하게 어떤 식으로 돌아가는지는 좀 더 연습하고 복습해 봐야 알 것 같았습니다.

 

 

멀티 플레이어 강의를 다 듣고 나서 점심을 먹은 뒤, 오후에는 유한 상태 기계 (FSM)에 대한 강의를 들었습니다. FSM은 유한한 갯수의 상태들로 구성된 기계 및 패턴을 의미하고 상태와 상태간의 전환을 기반으로 동작하는 동작 기반 시스템이라고 하네요. FSM에 대한 거는 따로 블로그 글로 쓰던지 해서 복습해야겠습니다.

 

 

그리고 오후 4시가 되어 스탠다드반 특강인 "Unity 추가 기능 2, NavMash"에 관련해서 듣게 되었습니다. AI Navigation에서 쓰이는 NavMash를 통해서 다양한 것을 할 수 있다던가, Navigation (Obsolete) 말고 새롭게 생긴 Navigation을 통해서 많은 기능들이 컴포넌트로 만들어져 있어 스크립트에서 제어할 수 있다는 점 등등 새로운 내용들을 많이 알아가는 시간이 된 것 같습니다. 그다음, 저녁을 먹고 난 후에는 팀원분들과 잠깐 이야기하다가 강의를 마저 본 후에, 8시 반에는 오늘 TIL을 뭐 쓸까 하다가 저번에 팀 프로젝트 때 많이 사용했던 ScriptableObject에 대해서 복습겸 쓰고, 오늘 하루를 마무리하였습니다.


ScriptableObject에 대해서

 

ScriptableObject란?

 

ScriptableObject는 Unity에서 대량의 데이터를 게임 오브젝트와 독립적으로 저장하고 관리할 수 있도록 해주는 클래스이다. 이 클래스는 가볍고 효율적인 데이터 관리 방법을 제공하며, MonoBehaviour와는 달리 씬에 종속되지 않고 여러 씬에서 데이터를 공유할 수 있게 해준다.


ScriptableObject를 사용하는 이유

 

 

1. 데이터 관리 : ScriptableObject를 사용하면 데이터를 효율적으로 조직하고 관리할 수 있다. 특히 게임 설정, 구성, 게임 데이터(예: 아이템 속성, 캐릭터 속성 등)를 저장하는 데 유용하다.

 

2. 성능 향상 : ScriptableObject는 특정 씬에 종속되지 않기 때문에, 여러 게임 오브젝트에 동일한 데이터를 중복해서 가지는 것보다 메모리 오버헤드가 줄어든다.

 

3. 재사용성 : ScriptableObject에 저장된 데이터는 여러 씬과 오브젝트에서 재사용할 수 있어, 코드베이스를 깨끗하고 유지보수하기 쉽게 만들어준다.

4. 인스펙터 커스터마이징 : ScriptableObject 에셋은 Unity 인스펙터에서 쉽게 편집할 수 있어, 프로그래머가 아닌 사람도 게임 데이터를 수정하기 용이하다.


ScriptableObject 생성 및 사용 방법

 

1. ScriptableObject 클래스 생성

먼저, ScriptableObject를 상속받는 새로운 C# 스크립트를 만든다.

using UnityEngine;

[CreateAssetMenu(fileName = "NewGameData", menuName = "Game Data", order = 1)]
public class GameData : ScriptableObject
{
    public string gameName;
    public int maxPlayers;
    public float gameDuration;
}
 

이 예제에서 GameData는 게임 관련 정보를 저장하는 간단한 클래스이다.

 

2단계: ScriptableObject 인스턴스 생성

스크립트를 생성한 후, 프로젝트 창에서 우클릭하고 Create → Game Data를 선택하여 ScriptableObject 인스턴스를 생성한다.

 

3단계: 데이터 구성

프로젝트 창에서 새로 생성된 ScriptableObject를 선택하고 인스펙터에서 속성을 설정한다.

 

4단계: 코드에서 ScriptableObject 사용

이제 이 ScriptableObject를 스크립트에서 사용할 수 있다. 예를 들어, 게임 매니저 스크립트에서 이를 참조할 수 있다.

using UnityEngine;

public class GameManager : MonoBehaviour
{
    public GameData gameData;

    void Start()
    {
        Debug.Log("Game Name: " + gameData.gameName);
        Debug.Log("Max Players: " + gameData.maxPlayers);
        Debug.Log("Game Duration: " + gameData.gameDuration);
    }
}

 

Unity 에디터에서 GameManager 스크립트를 게임 오브젝트에 추가하고, 인스펙터에서 GameData ScriptableObject를 GameData 필드에 드래그하여 설정한다.


ScriptableObject 사용의 장점

 

1. 데이터와 로직의 분리: ScriptableObject를 사용하면 데이터와 게임 로직을 분리하여 관리할 수 있어, 유지보수가 용이하다.

 

2. 테스트 및 디버깅 용이: 데이터가 별도로 저장되므로, 다양한 설정을 쉽게 테스트하고 디버깅할 수 있다.

 

3. 깨끗한 프로젝트 구조: ScriptableObject를 사용하면 데이터가 중앙에서 관리되고, 여러 게임 오브젝트에 중복되지 않아 프로젝트 구조가 깨끗해진다.