SideProjects/[집필] 실전 유니티 C#

[실전 유니티 C#] 열거체 enum

VirtualDever 2022. 5. 1. 21:13
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.UI;
using UnityEngine;

public class Player : MonoBehaviour {

  public enum State {
    Idle = 0, // 아무것도 하지 않는 상태
    Move,     // 이동 중인 상태
    Attack,   // 공격 중인 상태
    Skill,    // 스킬 사용 중인 상태
    Damaged,  // 적에게 공격을 받아 피해를 받은 상태
    Die       // 죽은 상태
  }
  
  public int currentHP = 70;                // 현재 체력
  public const int maxHP = 100;             // 체력 max
  public string name = "용감한 용사";        // 이름
  public string guildName = "[유니티용병단]";// 길드 명
  public int currentLevel = 1;              // 현재 레벨
  //public int state = 0;                   // 플레이어의 현재 상태 (정수형)
  public State currentState = State.Idle;   // 플레이어의 현재 상태 (열거체)
  
  private void Start() {
    string fullName = guildName + "Level" + currentLevel.ToString() + " " + name;

    switch (currentState) {
      case State.Idle:
        Idle();
        break;
      case State.Move:
        Move();
        break;
      case State.Attack:
        Attack();
        break;
      case State.Skill:
        Skill();
        break;
      case State.Damaged:
        Damaged();
        break;
      case State.Die:
        Die();
        break;
      default:
        break;
    }
  }

  private void Idle() {
    Debug.Log("Idle");
  }

  private void Move() {
    Debug.Log("Move");
  }

  private void Attack() {
    Debug.Log("Attack");
  }

  private void Skill() {
    Debug.Log("Skill");
  }

  private void Damaged() {
    Debug.Log("Damaged");
  }

  private void Die() {
    Debug.Log("Die");
  }
}

점점 코드가 길어지고 있습니다.

이번 시간에 배울 것은 열거체 enum 이라는 데이터 타입인데요.

일전에 배운 switch case 문에 숫자가 들어갔다면, 이번에는 열거체로 정의한 키워드를 사용할 수 있습니다.

먼저, 열거체를 아래와 같이 정의합니다.

 

public enum State {
  Idle = 0, // 아무것도 하지 않는 상태
  Move,     // 이동 중인 상태
  Attack,   // 공격 중인 상태
  Skill,    // 스킬 사용 중인 상태
  Damaged,  // 적에게 공격을 받아 피해를 받은 상태
  Die       // 죽은 상태
}

enum 이라는 키워드 다음에 열거체의 이름을 정하고, 그 아래에는 0 부터 시작해서 1 씩 증가하는 값들을 키워드로 정의할 수 있습니다.

예를들어, Idle 은 0 이고, Move는 1, Attack은 2, Skill은 3, Damaged는 4, Die는 5가 됩니다.

우리가 정의한 이 열거체는 유니티 에디터의 인스펙터 창에서도 텍스트로 보여집니다.

한 번 확인해 볼까요.

 

Current State 변수를 클릭해 보면 Idle, Move ... Die와 같이 드랍다운 메뉴가 펼쳐집니다.

이 중 하나를 선택할 수 있구요.

우선은 초기화한 Idle 그대로 두도록 하겠습니다.

그리고 다시 유니티 에디터의 플레이 버튼을 클릭해 보겠습니다.

Idle() 이라는 메서드가 실행되어서 콘솔 창에 Idle 이라는 텍스트가 출력되는 것을 확인할 수 있습니다.

어떤가요. state 정수형 변수와 동일한 기능을 하는것 같지 않나요?

가독성 측면에서는 확실히 열거체 형으로 정의해 두는 것이 좋겠습니다.

0이 이동 중인지, 공격 중인 상태인지 기억하고 프로그래밍 하기에는 저희의 기억력에도 한계가 있습니다.

따라서 가능하다면, 열거체로 정의해 놓고 switch case 문으로 분기를 나누는 것을 권장합니다.

 

//public int state = 0;                   // 플레이어의 현재 상태 (정수형)
public State currentState = State.Idle;   // 플레이어의 현재 상태 (열거체)

끝으로 열거체의 선언 방법을 설명드리고 마치려고 합니다.

플레이어의 현재 상태는 원래 정수형으로 쓰려고 했습니다만, 이것은 주석 처리해서 쓰지 않도록 합니다.

대신 우리가 정의한 State 라는 열거체 형을 커스터마이즈 또는 정의해서 쓰려고 합니다.

초기화를 0 에 해당하는 Idle로 설정하였습니다.

그리고 이 currentState라는 이름을 가진 변수를 switch () 문에 입력해서 분기를 나눌 수 있게 됩니다.

 

switch (currentState) {
  case State.Idle:
    Idle();
    break;
  case State.Move:
    Move();
    break;
  case State.Attack:
    Attack();
    break;
  case State.Skill:
    Skill();
    break;
  case State.Damaged:
    Damaged();
    break;
  case State.Die:
    Die();
    break;
  default:
    break;
}