유니티) 불필요한 설명을 너무 줄인 직렬화 기본
직렬화란?
데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 형식으로 변환하는 자동 프로세스
> 매번 스크립트를 수정할 필요 없이 에디터에서 값을 쉽게 수정
들어가기 전에,
스크립트에서 변수 초기화한 이후에 인스펙터의 값이 써지기에 논리 오류가 발생할 수 있으니 주의
예) public int hp = 5; 로 클래스에서 변수 선언과 동시에 초기화 > 인스펙터에 3 기입 > 인스펙터 값인 3이 반영
직렬화 가능한 규칙
1. 접근제어자
public
[SerializeField] private
[SerializeField] protected
2. 데이터 형식
기본 데이터 형식(int, float, string, bool, double 등)
유니티 내장 형식(Vector3, Quaternion, Rect, Color, Sprite 등)
위의 데이터 형식들의 배열 or List<T>
열거형(enum, 32바이트 이하)
UnityEngine.Object에서 파생된 오브젝트 참조(GameObject, Transform 등)
[Serializable] 커스텀 구조체 or 커스텀 클래스
사용 가능한 조건만 간략하게 정리했고 다음은 활용으로 넘어가보겠습니다.
직렬화 데이터를 잘 관리하기 위한 유니티 인스펙터 속성(Attribute)을 몇가지 소개하고자 합니다.
속성은 [] (대괄호) 안에 쓰며 적용 범위는 데이터 타입을 포함한 다음 구문 한줄입니다.
1. 인스펙터에 출현 유무
- [Serializable]
다음에 오는 사용자 정의 클래스 혹은 구조체를 인스펙터에 출현 - [SerializeField]
다음에 오는 데이터를 인스펙터에 출현
접근제어자가 private이나 인스펙터에 나오도록 할 때 주로 사용 - [HideInInspector]
다음에 오는 데이터를 인스펙터에서 숨김
접근제어자가 public이나 인스펙터에 나오지 않도록 할 때 주로 사용
2. 특정 데이터 타입에 붙여 인스펙터 사용을 편리하게 하는 추가 기능
- [Multiline (int line)]
다음에 오는 string 데이터는 line만큼의 줄 사용이 가능 - [TextArea(int min, int max)]
다음에 오는 string 데이터는 min~max 범위의 줄 사용이 가능 - [Range (float min, float max)]
다음에 오는 float 혹은 int 형식과 함께 사용
min, max에 int형을 쓰면 int 타입에 맞게 사용 가능
설정한 최소/최대값에 해당하는 스크롤바를 인스펙터에 생성
3. 인스펙터 정리 및 기타
- [Header (string HeaderName)]
인스펙터에 HeaderName의 중간 분류 생성 - [Space (float height)]
인스펙터에 height 만큼 공간을 띄워줌 - [ToolTip(string tooltip)]
인스펙터의 해당 변수 위에 마우스 커서를 올릴 때 툴팁 출현 - [ContextMenu(string itemName)]
인스펙터의 해당 스크립트 우클릭 메뉴에 함수 추가 - [ContextMenuItem(string name, string function)]
다음에 오는 데이터를 인스펙터에서 우클릭 했을 때
function 메서드의 기능을 하는 name 명칭의 메뉴 추가
< 코드 예제 >
속성은 여러 개를 한번에 쓸 수 있습니다.
using System;
using UnityEngine;
using System.Collections.Generic;
public class CardData_Serialize : MonoBehaviour
{
// 새로운 커스텀 직렬화 클래스의 리스트 생성
public List<Card_Serialized> 카드 = new List<Card_Serialized>();
// 인스펙터에서 변수명에 우클릭하면 나오는 메뉴에 초기화 메뉴 생성
[ContextMenuItem("초기화", "ExClear")]
public int ex;
// ContextMenuItem에서 사용할 함수 이름 그대로 쓰기
void ExClear()
{
ex = 0;
}
// 인스펙터에서 해당 스크립트 컴포넌트를 우클릭하면 메뉴 생성
[ContextMenu("카드 모두 초기화")]
public void DataInit()
{
카드.Clear();
}
}
// 커스텀 클래스를 직렬화하기 위해 [Serializable] 필요
[Serializable]
public class Card_Serialized
{
// 쉼표로 구분하여 여러 기능을 한 줄로 표현 가능
// 인스펙터의 모든 변수에 마우스를 올리면 각각 맞는 툴팁이 나오게끔
// 중간 타이틀 분류
// + 다음 pvivate 변수를 인스펙터에 출현
// + 다음 변수값을 조정할 수 있는 스크롤바 출현
[Header("분류"), SerializeField, Range(0, 2), Tooltip("카드 종류")]
int category;
// public 변수는 기본적으로 인스펙터에 출현
// 다음 public 변수를 인스펙터에서 숨김
[HideInInspector]
public int rank;
// 다음 string 타입은 인스펙터에서 2줄까지 사용 가능
// + 인스펙터의 변수에 우클릭하면 메뉴 추가(이름: 모두 지우기)
[Multiline(2), Tooltip("카드 이름")]
public string name;
// 생성된 enum을 형식으로 넣으면 인스펙터에 드롭다운 생성
[Tooltip("카드 번호")]
public GameManager.cardIndex cardIndex;
// 위와 공간을 5f 만큼 띄우고
// + 중간 분류 제목으로 스테이터스 추가
[Space(5f), Header("스테이터스"), Tooltip("카드를 사용할 때 필요한 코스트")]
public int cost;
[Tooltip("카드 공격력")]
public int atk;
[Tooltip("카드 체력")]
public int hp;
// 위와 공간을 10f만큼 띄우고
// + 다음 string 타입은 인스펙터에서 3~5줄까지 사용 가능
[Space(10f), TextArea(3, 5), Tooltip("카드 특수능력")]
public string[] ability;
}
< 결과 >
제가 이해한 내용을 바탕으로 사용에 필요한 정보만 최대한 간추렸기에
더 자세한 정보 및 심화 내용이 필요하다면 매뉴얼을 참조하면 좋습니다.
https://docs.unity3d.com/kr/2023.2/Manual/script-Serialization.html
스크립트 직렬화 - Unity 매뉴얼
직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스입니다.
docs.unity3d.com