카테고리 보관물: Unity

유니티(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# 스크립트를 붙여 손쉽게 관리하는 방법을 알아보았습니다.

유니티(Unity) Animator Override Controller 이용해서 애니메이션 변경하기

개요

게임을 개발하다 보면 기본적인 동작은 동일한데 외형만 변경되는 경우가 있습니다. 각각 Animator Controller를 생성해서 관리할 수도 있지만 종류가 많아지면 관리하기 너무 힘들게 됩니다. 이럴 때 Animator Override Controller 를 사용해서 하나의 Animator Controller 만 적용하도록 할 수 있습니다.

Animator Override Controller

Animator Override Controller 의 설명은 다음 주소에서 확인하실 수 있습니다. 핵심은 Animator Controller를 하나만 사용할 수 있다는 것 입니다.

https://docs.unity3d.com/kr/2020.3/Manual/AnimatorOverrideController.html

대략적인 설명과 예시를 보여주고 있는데 필자의 입장에서는 딱 와 닿지 않았습니다. 실제 예를 살펴보면서 알아보도록 하겠습니다.

게임 내 적 우주선 예시

적 우주선은 플레이어의 탄환을 맞으면 폭발하는 공통적인 특징을 가지고 있습니다. 적 우주선의 Animator Controller의 상태를 를 간단히 작업하면 예시와 같은 모양이 됩니다.

적 우주선 Animator Controller
적 우주선 Animator Controller

Assets/Resources 에 Animator Override Controller(마우스 우측버튼 > Create > Animator Override Controller) 를 생성합니다. 생성 후 위에서 정의한 Animator Controller를 지정합니다(예시에서는 enemy 라는 이름으로 작업).

Animator Override Controller에 Animator Controller를 지정한 상태
Animator Override Controller에 Animator Controller를 지정한 상태

여기에서 주의할 사항은 Animator Controller의 각 상태에 Motion 이 지정되어 있어야 Explosion, Fly, Hit 같은 항목이 나타난다는 것 입니다. 이런 이름들은 Motion에 지정된 Animation Clip 을 따릅니다. 필자는 처음에 Motion을 지정하지 않아도 상태 이름으로 나타날 것으로 예상했는데 그렇지 않아서 다른 문제가 있는지 알았습니다.

Animator Controller 의 Fly 상태 Motion 지정

Prefab을 하나 만들고 위의 Animator Controller 를 적용합니다. 작업을 완료하면 다음과 같이 됩니다. 이렇게 하면 각각의 Animator Override Controller 에 지정한 Animation Clip 이 적용되어 하나의 Animator Controller를 쓰면서 외형이 다른 애니메이션을 구현할 수 있습니다.

Animator Controller 에 Enemy01 Animator Override Controller 를 지정한 상태
Animator Controller 에 Enemy01 Animator Override Controller 를 지정한 상태

실행 중 상태에서 Animator Override Controller 변경하기

적 우주선의 종류가 게임이 실행되는 도중 조건에 따라 결정되는 경우가 있을 수 있습니다. 하나의 Prefab을 이용하고 Animator Controller 를 변경해서 외형을 변경하는 방법입니다. 다음의 코드와 같이 적용하면 됩니다.

var resourceName = "Animator Override Controller/Enemy0" + enemyType.ToString();
var animator = enemy.gameObject.GetComponent<Animator>();
animator.runtimeAnimatorController = (RuntimeAnimatorController)Resources.Load(resourceName);

유니티 에디터에서 Assets/Resources/Animator Override Controller 경로에 Enemy01, Enemy02 와 같은 이름으로 Animator Override Controller를 생성했습니다. 조건에 의해 enemyType이 정해지면 그것에 맞게 Animator Override Controller 가 적용되도록 했습니다.

이번글에서는 동작이 같고 외형만 변경되는 애니메이션을 쉽게 변경/관리할 수 있는 Animator Override Controller에 대해서 알아보았습니다.