기능 구현 방법 정리

유니티) 불필요한 설명을 너무 줄인 직렬화 기본

ybbro 2023. 9. 3. 23:20

직렬화란?

데이터 구조 또는 게임 오브젝트 상태를 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;
}

 

< 결과 >

변수 이름 위에 마우스를 가져다 대면 툴팁도 표시
enum을 통한 드롭다운 동작 확인
ContextMenu로 추가한 메뉴
ContextMenuItem으로 추가한 메뉴

 

제가 이해한 내용을 바탕으로 사용에 필요한 정보만 최대한 간추렸기에

더 자세한 정보 및 심화 내용이 필요하다면 매뉴얼을 참조하면 좋습니다.

https://docs.unity3d.com/kr/2023.2/Manual/script-Serialization.html

 

스크립트 직렬화 - Unity 매뉴얼

직렬화는 데이터 구조 또는 게임 오브젝트 상태를 Unity가 보관하고 나중에 다시 복구할 수 있는 포맷으로 변환하는 자동 프로세스입니다.

docs.unity3d.com