본문 바로가기

Unity3d

게임 개발의 효율성을 잠금 해제: Unity에서 에디터 스크립팅의 힘

게임 개발 영역에서 효율성은 그저 유행어가 아니라, 성공적인 프로젝트의 핵심 구성 요소입니다. 강력한 도구 모음을 제공하는 Unity는 창작자에게 믿을 수 없는 플랫폼을 제공합니다. 하지만 그 힘을 진정으로 활용하려면, Unity 에디터를 확장하고 사용자 정의하여 에디터 스크립팅을 통해 보다 효율적인 게임 개발을 위한 과정을 탐색하는 것이 핵심입니다. 이 글은 그 과정을 명확히 설명하여 중급 개발자들이 에디터 스크립팅의 힘을 활용하여 보다 효율적인 게임 개발을 할 수 있도록 안내하는 것을 목표로 합니다.

에디터 스크립팅의 기초

본질적으로, 에디터 스크립팅은 특정 프로젝트의 필요에 맞게 Unity 에디터 내에서 도구와 기능을 만드는 것에 관한 것입니다. 이는 반복적인 작업을 자동화하는 것부터, 사용자 정의 자산 프로세서를 생성하는 것, 심지어 에디터 자체에 완전히 새로운 기능을 추가하는 것에 이르기까지 다양합니다. 주요 언어는 Unity 게임 개발에도 사용되는 C#이므로, 학습 곡선이 부드럽습니다.

간단한 예제로 시작하기

기본적인 예제로 시작해 봅시다: 선택한 GameObject의 위치를 원점(0,0,0)으로 재설정하는 사용자 정의 메뉴 항목을 생성합니다.

using UnityEditor;
using UnityEngine;

[CustomEditor(typeof(CharacterStats))]
public class CharacterStatsEditor : Editor
{
    public override void OnInspectorGUI()
    {
        CharacterStats stats = (CharacterStats)target;

        stats.health = EditorGUILayout.IntSlider("Health", stats.health, 0, 100);
        stats.strength = EditorGUILayout.IntSlider("Strength", stats.strength, 0, 100);

        if (GUILayout.Button("Reset Stats"))
        {
            stats.Reset();
        }

        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }
}

이 스크립트는 몇 가지 핵심 개념을 소개합니다:

  • [MenuItem] 속성: Unity의 메뉴에 명령을 추가합니다. 여기서, "Tools/Reset Position %#r"은 "Tools" 아래에 "Reset Position"이라는 새 항목을 만들고, 단축키로 Ctrl+Shift+R (Mac에서는 Cmd+Shift+R)을 사용합니다.
  • Selection.gameObjects: 에디터에서 현재 선택된 GameObjects 배열에 접근합니다.
  • Undo.RecordObject(): 우리의 위치 재설정 작업이 취소 가능하도록 보장하는 것으로, 에디터 수정에 대한 모든 최선의 방법에 해당합니다.

사용자 정의 인스펙터로 에디터 확장하기

단순한 도구를 넘어서, 사용자 정의 인스펙터는 GameObject와 컴포넌트가 에디터에서 어떻게 표시되고 상호 작용되는지에 대한 더 깊은 사용자 정의를 허용합니다. 캐릭터 통계를 관리하는 스크립트가 있고 디자이너를 위한 더 직관적이고 오류가 없는 인터페이스를 제공하고자 한다고 가정해 보겠습니다.

using UnityEditor;
using UnityEngine;

public class TextureImportProcessor : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        TextureImporter importer = (TextureImporter)assetImporter;
        importer.textureType = TextureImporterType.Sprite;
        importer.mipmapEnabled = false;
    }
}

여기서 CharacterStats는 캐릭터의 건강과 힘을 관리하는 가상의 컴포넌트입니다. CustomEditor를 생성함으로써 우리는 기본 인스펙터를 건강과 힘에 대한 슬라이더를 사용하는 것으로 대체할 수 있고 (잘못된 값을 입력할 수 없게 만듭니다) 편리함을 위해 "Reset Stats" 버튼을 추가할 수 있습니다.

자동화 및 일괄 처리

에디터 스크립트는 특히 대량의 자산이나 설정을 다룰 때 작업을 자동화하는 데 뛰어납니다. 수백 개의 텍스처에 일관된 세트의 가져오기 설정을 적용해야 하는 상황을 상상해 보세요:

using UnityEditor;
using UnityEngine;

public class TextureImportProcessor : AssetPostprocessor
{
    void OnPreprocessTexture()
    {
        TextureImporter importer = (TextureImporter)assetImporter;
        importer.textureType = TextureImporterType.Sprite;
        importer.mipmapEnabled = false;
    }
}

이 스크립트는 가져올 때 텍스처를 스프라이트로 자동 설정하고 mipmaps를 비활성화하여 단 몇 줄의 코드로 엄청난 시간을 절약할 수 있음을 보여줍니다.

ScriptableObjects를 활용하여 설정 가능한 데이터 활용하기

ScriptableObjects는 하드 코딩된 값을 필요로 하지 않고 도구 설정이나 게임 데이터를 생성하고 관리하는 강력한 방법을 제공합니다. 에디터 스크립팅에서 특히 유용하며, 도구 설정이나 게임 데이터를 저장하는 데 사용됩니다.

using UnityEngine;

[CreateAssetMenu(fileName = "NewGameConfig", menuName = "Game Config", order = 0)]
public class GameConfig : ScriptableObject
{
    public float playerSpeed;
    public GameObject playerPrefab;
}

ScriptableObjects를 활용함으로써 개발자는 Unity 에디터에서 직접 데이터 자산을 생성할 수 있어 게임 개발 과정을 더욱 동적이고 적응 가능하게 만듭니다.

결론

제공된 예제들은 Unity 에디터 스크립팅으로 가능한 것들의 표면을 긁어낸 것에 불과합니다. 이러한 기술을 받아들임으로써, 개발자는 작업 흐름을 상당히 간소화하고, 단조로운 작업을 자동화하며, 게임 개발의 창의적인 측면에 더 집중할 수 있습니다.