[Unity] #if, #endif
![[Unity] #if, #endif](/_next/image?url=https%3A%2F%2Fdata.develog.develrocket.com%2Fupload%2Fdevelog%2Fuser_1777093328305%2F1786778972982-xrtzbj%2F_____2026-08-15_162920.png&w=3840&q=75)
댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요.
어제 프로젝트 빌드를 하는 날이었는데 처음 보는 문제를 겪었다. 빌드를 하는데 갑자기 아래 창이 뜨더니
아래와 같은 로그가 생겼다.
Addressables는 에셋을 이름표로 불러쓰는 Unity 패키지인데, 우리 프로젝트에서는 Localization 패키지를 사용하기에 내부적으로 Addressables가 딸려온다. 그래서 빌드에 포함이 되어야하는데 Addressables 빌드가 실패한다는 내용이다.
Localization은 언어 변경
사실 Localization 작업도 내가 안했고 Addressables도 처음 들어본 개념이라 막막했지만 클로드에게 물어보니 너무 간단한 문제였다. 사실 Localiation, Addressables랑 관련있는 에러가 아니고 #endif 전처리기 지시문이 문제였다.

사실 핵심 문제는 이 로그였다. Addressables는 콘텐츠를 만들기 전에 플레이어 스크립트를 먼저 컴파일한다. 그게 실패하면 그 뒤로는 아무것도 못 하고 SBP ErrorError 같은 알아먹기 힘든 메시지만 뱉는 것이었다. 즉 Addressables가 고장난 게 아니라, 그냥 평범한 C# 컴파일 에러가 있었던 거다.
콘솔 에러를 다시 뒤져보니 이게 있었다.
RunSaveManager.Towers.cs(79,73): error CS1061:
'StartMapTileRegistry' does not contain a definition for 'TryGetTileId'
TryGetTileId가 없다고 한다. 그런데 코드를 열어보면 분명히 있다.
범인은 StartMapTileRegistry.cs의 #endif 위치였다.
#if UNITY_EDITOR
private void GenerateMissingTileIds()
{
// Undo, SerializedObject, PrefabUtility 사용 — 에디터 전용이 맞다
}
public bool TryGetTileId(BattleTile tile, out string tileId)
{
// Dictionary 순회가 전부. UnityEditor API를 하나도 안 쓴다.
}
#endif // ← 여기가 문제
원래는 에디터 API를 쓰는 GenerateMissingTileIds만 감싸려던 건데, #endif가 너무 아래에 있어서 그 밑의 TryGetTileId까지 같이 삼켜버렸다. 그리고 TryGetTileId는 게임을 저장할 때 도는 런타임 코드에서 호출되고 있었다.
그래서 그냥 #endif 위치만 바꿔서 해결했다.
#if는 전처리기 지시문(preprocessor directive) 이다. Unity 문법이 아니라 C# 언어 자체의 기능이다.
이름이 헷갈리는데, "전처리기"란 컴파일러가 코드를 컴파일하기 전에 먼저 훑고 지나가는 단계를 말한다. 그 단계에서 #if 조건을 보고 코드를 잘라내거나 남긴다.
#if UNITY_EDITOR
Debug.Log("에디터입니다");
#endif
보통 Unity에서 사용할땐 에디터에서만 작동하는 코드를 넣기 위해 #if 뒤에 UNITY_EDITOR를 정의해서 에디터에서만 동작하게하고, 실제 빌드본에서는 동작하지 않도록 구현한다.
문법은 이렇게 생겼고 &&, ||, !도 쓸 수 있다.
#if UNITY_EDITOR
#elif UNITY_ANDROID
#else
#endif
Unity가 컴파일 대상에 따라 자동으로 정의해주는 심볼들이 있다.
| 심볼 | 언제 정의되나 |
|---|---|
| UNITY_EDITOR | 에디터용으로 컴파일할 때 |
| UNITY_STANDALONE_WIN | Windows 스탠드얼론 빌드 대상일 때 |
| UNITY_ANDROID / UNITY_IOS | 각 플랫폼 대상일 때 |
| DEVELOPMENT_BUILD | Development Build 체크하고 빌드할 때 |
다행히 빌드날 큰 문제는 아니고 #endif 겨우 한줄로 발생한 해프닝이었지만, 뭔가 클로드가 없었다면 문제를 한참 찾았을 것 같다. 에디터에서는 잘 동작하지만 빌드에 에러가 생겼다면 #endif위치를 보는것도 중요할 것 같다.
SerializeReference
![[Unity] 튜토리얼 설계](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1787322579554-zopplu/_____2026-08-21_232731.png)
튜토리얼 설계
![[Unity] Event Trigger Component](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1786976296699-a3tu75/_____2026-08-17_231353.png)
Unity Event Trigger 컴포넌트
![[Unity] 튜토리얼 설계](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1787322579554-zopplu/_____2026-08-21_232731.png)
![[Unity] Event Trigger Component](https://data.develog.develrocket.com/upload/develog/user_1777093328305/1786976296699-a3tu75/_____2026-08-17_231353.png)