유니티(Unity) C# 스크립트를 이용한 게임 관련 변수 관리

개요

게임 내 여러 요소를 제어하기 위해 많은 변수가 필요합니다. 우주 슈팅 게임을 예로 들어본다면 플레이어, 적, 보스 등등 각 객체에 고유한 특성을 정의하는 값이 존재합니다. 이런 변수 값을 체계적으로 잘 정리해 두어야 테스트 및 난이도 조절할 때 쉽게 변경할 수 있습니다.

변수값을 관리하는 방법이 여러가지(DB, File…)가 있습니다. 이번 글에서는 C# 스크립트를 이용해 보도록 하겠습니다.

변수 관리 스크립트

각종 변수 정보를 담을 C# 스크립트를 생성합니다(Create > C# Script). 아래 코드와 같은 형태로 내용을 입력합니다.

public class GameControlData : MonoBehaviour
{
    public static GameControlData GAME_CONTROL_DATA;

    void Awake()
    {
        if (GAME_CONTROL_DATA == null) 
        {
            DontDestroyOnLoad(gameObject);
            GAME_CONTROL_DATA = this;
        } 
    }
}

Awake 메소드에 DontDestoryOnLoad 를 이용해서 다른 Scene 에서도 사용할 수 있도록 해 줍니다. 그리고 정적변수로 정의한 GAME_CONTROL_DATA 가 비어 있는 경우 this 로 대입해 줍니다.

GameObject 생성 및 스크립트 적용

빈 게임 오브젝트를 하나 만들고 Scene에 배치합니다. 여기에 위에서 생성한 스크립트를 붙여줍니다. 그러면 다음과 같은 상태가 됩니다.

빈 오브젝트를 생성하고 스크립트를 부착한 상태
빈 오브젝트를 생성하고 스크립트를 부착한 상태

필요한 변수들을 다음 코드와 같이 스크립트에 추가하면 다음과 같이 에디터에서 변수가 나타나는 것을 확인할 수 있습니다.

public static GameControlData GAME_CONTROL_DATA;

public float playerSpeed;
public float enemySpeed;
public int itemType;

void Awake()
{
    if (GAME_CONTROL_DATA == null)
    {
        DontDestroyOnLoad(gameObject);
        GAME_CONTROL_DATA = this;
    }
}
변수 추가 후 에디터에서 변경된 상태
변수 추가 후 에디터에서 변경된 상태

이제 에디터에서 변수의 값을 변경할 수 있습니다. 이 경우 에디터에서 지정된 값이 적용됩니다. 조정을 통해 변수의 값을 확정한 후 원래 스크립트의 값을 변경하면 됩니다.

다른 스크립트에서 참조

다른 스크립트에서는 다음 코드와 같은 형식으로 참조합니다.

using static GameBaseData;

GAME_CONTROL_DATA.playerSpeed = 1.0f;

using static 지시문을 이용해서 축약된 형태로 변수를 참조할 수 있도록 합니다.

유형별 변수 정리

변수가 많아지면 각 분류별로 정리된 것이 관리하기 편합니다. 다음과 같이 변수를 유형별로 나누어 에디터에서 구분되어 나타나도록 할 수 있습니다.

[Header("Player Setting")]
public float playerSpeed;
public float playerPower;

[Header("Enemy Setting")]
public float enemySpeed;

[Header("Item Setting")]
public int itemType;
[SerializeField]
private int itemPower;
변수를 분류한 후 에디터의 상태
변수를 분류한 후 에디터의 상태

변수가 private 라도 [SerializeField]로 지정하면 에디터에 나타나 쉽게 변경할 수 있습니다.

이번글에서는 간단한 게임의 변수 항목을 게임 오브젝트에 C# 스크립트를 붙여 손쉽게 관리하는 방법을 알아보았습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Time limit is exhausted. Please reload the CAPTCHA.