이번 프로젝트에서 스타듀밸리의 낚시 미니게임과 도감을 구현했다.
낚싯대와 물고기 데이터를 관리해야 하는데, 20종이 넘는 물고기를 프리팹으로 만들어 각각 값을 넣어놓아야 하나 고민하다가 공부할 겸 이번에 Scriptable Object를 활용해 보게 되었고, 앞으로 자주 쓸 것 같아 자료를 정리해보았다.
SriptableObject의 개념과 장점
Scriptable Object란 데이터 저장 컨테이너이다.
프리팹을 인스턴스화 할 때마다 데이터 사본이 중복되어 생성되는데, 인스턴스화된 프리팹에서 ScriptableObject에 저장해둔 데이터에 접근해서 사용하는 방식이 메모리 관리 측면에서 더 효율적이다.
사용 방법
1. Scriptable Object 스크립트 작성
새 스크립트를 만들어 Monobehaviour가 아닌 ScriptableObject 클래스를 상속한다.
낚싯대 타입, 이름, 거리, 가격, 사용가능여부 값을 저장하도록 했다.
using UnityEngine;
using EnumTypes;
[CreateAssetMenu(fileName = "Fishing Rod Data", menuName = "Scriptable Objects/Fishing Rod Data")]
public class FishingRodData : ScriptableObject
{
public RodType RodType;
public string RodName;
public float Distance;
public int Cost;
public bool IsUsable;
}
2. Scriptable Object 인스턴스 생성
Create > Scriptable Objects에서 작성한 Fishing Rod Data의 Scriptable Object 생성이 가능하다.
3. 생성된 Scriptable Object에 데이터 입력
원하는 값으로 데이터를 초기화를 해준다.
4. 입력한 Scriptable Object 데이터 참조하기
데이터를 사용할 스크립트에서 FishingRodData 클래스를 연결한다.
스크립트에서 변수 선언 대신 Scriptable Object에 접근해 값을 가져다 사용할 수 있다.
using UnityEngine;
public class FishingRod : MonoBehaviour
{
// ScriptableObject
public FishingRodData rodData;
public void InitRodData(FishingRodData data)
{
rodData = data;
}
public void PrintRodData()
{
Debug.Log($"{rodData.RodType}");
Debug.Log($"{rodData.RodName}");
Debug.Log($"{rodData.Distance}");
Debug.Log($"{rodData.Cost}");
Debug.Log($"{rodData.IsUsable}");
}
}
🔗 참고자료
https://www.youtube.com/watch?v=7Qt4QNhM4nY
https://docs.unity3d.com/kr/current/Manual/class-ScriptableObject.html
'유니티' 카테고리의 다른 글
[유니티] 월드좌표(Space.World)와 로컬좌표(Space.Self) (0) | 2023.01.11 |
---|---|
[유니티] 오브젝트 삭제하는 방법 | Destroy(gameObject) vs Destory(this) (0) | 2023.01.10 |