Unity Standalone 빌드 컴파일 에러, 원인은 런타임 스크립트에 남아있던 using UnityEditor였다.

TangTang 개발기 #1 — 트러블슈팅

에디터에서는 멀쩡했지만

팀 프로젝트로 만들고 있는 뱀파이어 서바이벌류 게임 UDangTangTang. Unity 에디터 안에서는 문제없이 잘 돌아갔습니다. 플레이 버튼을 누르면 게임이 실행되고, 몬스터도 스폰되고, 무기 진화도 정상적으로 작동했습니다.

문제는 Standalone 빌드를 뽑으려는 순간 터졌습니다. 에디터에서는 단 한 번도 본 적 없는 컴파일 에러가 콘솔을 가득 채웠습니다.

Assembly 'Assembly-CSharp' will not be compiled because
it references UnityEditor which is not available at runtime.

에디터에서는 잘 돌아가던 코드가 왜 빌드만 하면 실패하는지, 처음엔 원인을 짐작하기 어려웠습니다.

원인 파악: 코드 전체 리뷰

프로젝트 코드(Assets/Script/ 기준 약 1만 줄, 130여 개 파일)를 처음부터 다시 훑어보는 과정에서 원인을 찾았습니다.

런타임에 실행되는 일반 스크립트 여러 곳에 “using UnityEditor” 구문이 그대로 남아 있었습니다.

문제가 발견된 파일 5곳:

파일역할
PlayerController.cs플레이어 이동/조작
SO/EnemyRegistry.cs적 데이터 레지스트리
SO/ArtifactRegistry.cs아티팩트(강화서) 레지스트리
UI/Lobby/EquipDropSlot.cs로비 UI
UI/Ingame/Alarm.cs인게임 UI

전부 게임이 실제로 실행될 때 동작해야 하는, 즉 런타임 스크립트였습니다.

왜 이게 문제가 되었을까?

UnityEditor 네임스페이스는 Unity 에디터 안에서만 존재하는 API입니다. 인스펙터 커스터마이징, 에디터 확장 툴 등을 만들 때 쓰는 코드로, 실제 게임 빌드(Standalone, 모바일 등)에는 애초에 포함되지 않습니다.

그런데 이 UnityEditor가 런타임 스크립트 안에 들어가 있으면:

  • 에디터에서 플레이할 때: 에디터 자체가 UnityEditor 어셈블리를 갖고 있어서 아무 문제 없이 컴파일됩니다
  • 실제로 빌드할 때: 빌드 결과물에는 UnityEditor 어셈블리가 존재하지 않으므로, 이를 참조하는 스크립트는 컴파일 자체가 불가능합니다

“에디터에서는 되는데 빌드만 하면 안 되는” 문제의 전형적인 원인이었습니다.

해결: 사용하지 않는 using 구문 제거

다행히 코드를 뜯어보니 해당 using UnityEditor 구문들은 실제로는 사용되지 않는 불필요한 import였습니다. 즉 해결 자체는 단순했습니다.

// Before
using UnityEditor;   // 사용하지도 않는데 남아있던 줄
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // ...
}
// After
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // ...
}

해당 5개 파일에서 미사용 using UnityEditor* 한 줄씩만 삭제했더니, 빌드가 바로 정상적으로 통과했습니다.

만약 UnityEditor 기능이 실제로 필요하다면

이번엔 단순 미사용 import라 삭제로 끝났지만, 커스텀 인스펙터나 에디터 툴처럼 UnityEditor 기능을 실제로 써야 하는 경우도 분명 있습니다. 이럴 때는 #if UNITY_EDITOR 전처리기 지시문으로 감싸주면 됩니다.

#if UNITY_EDITOR
using UnityEditor;
#endif

public class SomeScript : MonoBehaviour
{
#if UNITY_EDITOR
    // 에디터에서만 컴파일/실행되어야 하는 코드
#endif
}

이렇게 감싸두면 에디터에서는 해당 코드가 정상 포함되고, 실제 빌드에서는 자동으로 제외되어 컴파일 에러 없이 넘어갑니다.

배운 점 3가지

  1. 에디터에서 문제없다고 빌드도 안전한 건 아니다. 개발 중간중간 주기적으로 빌드를 시도해보는 습관이 필요합니다. 기능 개발이 다 끝난 뒤에야 빌드해보면, 이번처럼 원인 찾기가 훨씬 번거로워집니다.
  2. 불필요한 using 구문은 그때그때 정리하자. IDE의 “미사용 using 정리” 기능만 주기적으로 돌려도 이런 문제를 예방할 수 있습니다.
  3. UnityEditor API가 필요한 코드는 처음부터 #if UNITY_EDITOR로 감싸는 습관을 들이자. 나중에 찾아 고치는 것보다 처음부터 구분해두는 편이 훨씬 안전합니다.

작은 실수 하나였지만, 발견하지 못했다면 “에디터에서만 돌아가는 게임”으로 남을 뻔했습니다. Standalone 빌드가 원인 불명으로 실패한다면, 혹시 런타임 스크립트에 using UnityEditor가 섞여 있지 않은지부터 확인해보시길 추천드립니다.

댓글 달기

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

위로 스크롤