Menu
CoddyTech

직렬화 가능한 클래스

Coddy Unity 여정의 Unity 게임 아키텍처 섹션에 포함된 레슨. 50개 중 15번째.

설정이 많은 스크립트는 Inspector에 길고 평평한 목록으로 표시됩니다. 일반 C# 클래스를 사용하면 설정을 그룹화할 수 있습니다. 클래스에 [System.Serializable]을 표시하고 해당 클래스의 필드를 만들면, 필드 이름을 딴 접이식 항목으로 표시되고 그 안에 클래스의 필드가 들어갑니다. 하나의 클래스는 여러 필드와 여러 스크립트에서 사용할 수 있습니다.

[System.Serializable]
public class Stats
{
    public float speed = 2f;
    public int damage = 10;
}

public class Enemy : MonoBehaviour
{
    public Stats normal;
    public Stats enraged;
    private Stats current;

    void Start()
    {
        current = normal;
    }

    void Update()
    {
        transform.Translate(0f, 0f, current.speed * Time.deltaTime);
    }

    public void Enrage()
    {
        current = enraged;
    }
}

Inspector에는 Normal과 Enraged라는 두 개의 접이식 항목이 표시되며, 각 항목에는 Speed와 Damage가 있습니다. 각 Enemy는 자신만의 Inspector에서 값을 설정하는 두 개의 Stats 객체를 가지며, 코드는 normal.speed처럼 값을 읽습니다. Unity는 스크립트를 로드할 때 이 객체들을 생성하므로, = new Stats()가 없어도 normal은 절대 null이 아니며, 필드 초기값(2와 10)은 새 Enemy가 시작할 때 사용하는 값입니다. struct도 [System.Serializable] public struct Range { public float min; public float max; }와 같이 특성을 사용하면 같은 방식으로 동작하며, Vector3처럼 할당할 때 복사됩니다.

Unity는 저장하도록 지정된 타입만 저장하기 때문에 이 특성이 필요합니다. 특성이 없으면 클래스가 Inspector에 표시되지 않습니다. 접이식 항목이 없고, 거기서 설정한 값은 저장되지 않으며, Unity가 객체를 생성하지 않으므로 normal.speed는 NullReferenceException을 발생시킵니다. 클래스 내부에도 일반적인 Inspector 규칙이 적용됩니다. public 필드 또는 [SerializeField]가 지정된 private 필드만 사용할 수 있으며, 프로퍼티나 static 필드는 사용할 수 없습니다.

challenge icon

챌린지

쉬움

탐험가의 손전등에는 두 가지 빔이 있으며, Space를 누르면 주변을 살펴볼 때 쓰는 넓고 따뜻한 빔과 동굴 깊숙이까지 비추는 좁고 차가운 흰색 빔 사이를 전환합니다. Flashlight.cs에는 각 빔의 설정 세 가지가 서로 관련 없는 필드 여섯 개로 저장되어 있습니다. 씬에는 이미 빔별로 설정이 묶여 있으므로, 스크립트도 이에 맞춰야 합니다:

  • 세 개의 public 필드인 color(Color), range와 angle(float)로 구성된 struct Beam을 선언하세요. Inspector에 표시되어야 합니다.
  • 서로 관련 없는 필드 여섯 개를 wide와 focused라는 Beam 필드 두 개로 바꾸세요. 씬에서는 wide를 따뜻한 색, range 6, angle 80으로 설정하고, focused를 차가운 흰색, range 15, angle 25로 설정합니다.
  • Apply()가 현재 빔의 Beam을 읽고, 그 값을 사용해 Light의 color, range, spotAngle을 설정하도록 하세요. 나머지는 그대로 유지합니다. 손전등은 wide 빔으로 시작하고, Space를 누르면 빔이 전환됩니다.

Play를 누르고, Space를 눌러 동굴의 먼 끝을 비춘 다음 Check를 누르세요.

직접 해보기

using UnityEngine;
using UnityEngine.InputSystem;

public class Flashlight : MonoBehaviour
{
    public Color wideColor = Color.white;
    public float wideRange = 5f;
    public float wideAngle = 60f;
    public Color focusedColor = Color.white;
    public float focusedRange = 10f;
    public float focusedAngle = 30f;
    private bool focusedOn;
    private Light lamp;

    void Start()
    {
        lamp = GetComponent<Light>();
        Apply();
    }

    void Update()
    {
        if (Keyboard.current.spaceKey.wasPressedThisFrame)
        {
            focusedOn = !focusedOn;
            Apply();
        }
    }

    void Apply()
    {
        lamp.color = focusedOn ? focusedColor : wideColor;
        lamp.range = focusedOn ? focusedRange : wideRange;
        lamp.spotAngle = focusedOn ? focusedAngle : wideAngle;
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Unity 게임 아키텍처의 모든 레슨