플레이 모드에 진입하면 빌드와 동일하게 프로젝트가 실행됩니다. 플레이 모드일 때 에디터 내에서 변경한 사항은 플레이 모드를 종료하면 초기화됩니다.
에디터 내에서 플레이 모드로 진입할 때마다 Unity에서 두 가지 중요한 작업을 수행합니다.
도메인 리로드:스크립팅 상태 백업, 언로드 및 재작성
씬 리로드:씬을 없애고 다시 로드
스크립트와 씬이 복잡할수록 이 두 가지 작업에 더 많은 시간이 소요됩니다.
더 이상 스크립트를 변경할 계획이 없는 경우Enter Play Mode Settings(Edit > Project Settings > Editor)를 활용하여 컴파일 시간을 단축하세요. Unity는 도메인 리로드와 씬 리로드 중 하나 또는 두 가지 모두를 비활성화하는 옵션을 제공합니다. 이를 통해 플레이 모드 진입 및 종료 속도를 높일 수 있습니다.
다만, 스크립트를 추가로 변경할 계획이라면 도메인 리로드를 재활성화해야 합니다. 마찬가지로 씬 계층 구조를 수정하는 경우에는 씬 리로드를 재활성화해야 합니다. 그렇지 않으면 예기치 않은 동작이 발생할 수 있습니다.
반응형
<어셈블리 관리를 사용한 컴파일 제어>
어셈블리는 C# 코드 라이브러리로, 여기에 포함된 리소스와 유형은 함께 사용 가능하며 기능의 논리적 단위를 형성합니다. 기본적으로 Unity는 대부분의 게임 스크립트를 미리 정의된 어셈블리인Assembly-CSharp.dll로 컴파일합니다. 이는 소규모 프로젝트에서 잘 작동하지만 다음과 같은 단점이 있습니다.
하나의 스크립트를 변경할 때마다 Unity에서 다른 스크립트까지 모두 재컴파일합니다.
스크립트가 다른 스크립트에 정의된 유형에 액세스할 수 있습니다.
모든 스크립트가 모든 플랫폼용으로 컴파일됩니다.
스크립트를 커스텀 어셈블리로 구성하면 모듈성과 재사용성이 향상됩니다. 또한 스크립트가 기본 어셈블리에 자동으로 추가되지 않으며, 액세스 가능한 스크립트도 제한됩니다.
위의 다이어그램과 같이 코드를 여러 어셈블리로 나눌 수 있습니다. 여기에서 Main의 코드를 변경하더라도 Stuff의 코드는 영향을 받지 않습니다. 마찬가지로 Library가 다른 어셈블리에 종속되지 않으므로 Library의 코드를 다른 프로젝트에서 쉽게 재사용할 수 있습니다.
프로젝트마다 스크립트 템플릿을 정하려면Assets/ScriptTemplates폴더를 만든 다음, 해당 폴더에 스크립트 템플릿을 복사하여 기본 템플릿을 오버라이드하세요.
모든 프로젝트를 대상으로 하는 기본 스크립트 템플릿도 직접 수정이 가능하지만, 수정 전에 원본을 백업해야 합니다.
81-C# Script-NewBehaviourScript.cs.txt의 원본 파일은 다음과 같습니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#ROOTNAMESPACEBEGIN#
public class #SCRIPTNAME# : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
#NOTRIM#
}
// Update is called once per frame
void Update()
{
#NOTRIM#
}
}
#ROOTNAMESPACEEND#
다음 두 가지 키워드를 기억해 두는 것이 좋습니다.
#SCRIPTNAME#은 입력한 파일 이름 또는 기본 파일 이름(예: NewBehaviourScript)을 나타냅니다.
#NOTRIM#은 괄호 안에 공백 줄이 포함되도록 합니다.
Unity 에디터를 다시 시작하면 커스텀 MonoBehaviour를 생성할 때마다 변경 사항이 적용되어 나타납니다.
비슷한 방식으로 다른 템플릿도 수정할 수 있습니다. 원본의 사본과 수정본은 Unity 프로젝트 파일 외부에 안전하게 보관해주세요.
반응형
<속성을 사용하여 인스펙터 커스터마이즈>
Unity에는 클래스나 프로퍼티, 함수 위에 배치하여 특수한 동작을 나타낼 수 있는 다양한 속성이 있습니다. C#에서는 속성 이름을 대괄호로 묶습니다.
장 가능한 에디터는 Unity의 강점 중 하나입니다.UI Toolkit패키지나IMGUI모드를 사용하여 커스텀 창과 인스펙터와 같은 에디터 UI를 만들 수 있습니다.
UI Toolkit의 워크플로는 표준 웹 개발과 유사합니다. HTML과 XML에서 영감을 받은 마크업 언어인UXML을 사용하여 사용자 인터페이스와 재사용 가능한 UI 템플릿을 정의하세요. 그런 다음,USS(Unity Style Sheets)를 적용하여 UI의 시각적 스타일과 동작을 수정하세요.
또는 위에서 언급한 대로 즉시 모드인 IMGUI를 사용해도 됩니다. 먼저에디터기본 클래스에서 가져온 다음,CustomEditor속성을 사용하세요.
Addressables Groups에서 각 에셋의 커스텀 주소와 위치를 확인할 수 있습니다.
편의를 위해 에셋의 개별 Address 필드에서 각 주소를 바꾸거나 한꺼번에 간소화할 수도 있습니다.
한 번의 메뉴 동작으로 Addressable Names를 간소화하거나 개별적으로 이름을 변경합니다.
기본 빌드 스크립트를 사용하여 Addressable Group 에셋 번들을 생성합니다.
이 에셋들을 번들로 묶어 다른 서버에서 호스팅하거나 프로젝트 내에서 로컬로 배포합니다. 에셋의 위치와 상관없이 시스템은 Addressable Name 문자열을 사용하여 에셋을 찾을 수 있습니다.
이제 어드레서블 API를 통해 어드레서블 에셋을 사용할 수 있습니다.
참고로 어드레서블이 없다면 씬에서 프리팹을 인스턴스화하기 위해 다음을 완료해야 합니다.
public GameObject prefabToCreate;
public void CreatePrefab()
{
GameObject.Instantiate(prefabToCreate);
}
이 방식에는 참조된 모든 프리팹(예: prefabToCreate)이 씬에 필요하지 않더라도 메모리에 로드된다는 단점이 있습니다.
대신 어드레서블을 사용하여 다음과 같이 하세요.
public string prefabByAddress;
…
public void CreatePrefabWithAddress()
{
Addressables.Instantiate(prefabByAddress, instantiationParameters, bool);
}
이렇게 하면 에셋의 주소 문자열로 에셋이 로드됩니다. 즉, 필요한 상태가(CreatedPrefabWithAddress 내에서 Adressables.Instantiate를 호출할 때) 되기 전까지는 프리팹이 메모리에 로드되지 않습니다. 여기에 더해 고수준 참조 계산용으로어드레서블을 사용하면 번들과 관련 에셋을 더는 사용하지 않을 때 자동으로 언로드할 수 있습니다.
어드레서블 에셋 시스템으로 메모리 최적화하기포스팅에서 메모리 효율성을 높이는 방식으로 Addressables Groups를 구성하는 방법에 대한 예시를 볼 수 있습니다. 또한어드레서블 개념 소개튜토리얼에서는 어드레서블 에셋 시스템이 프로젝트에서 어떻게 작동하는지 간단히 설명합니다.
반응형
<라이브 게임 운영: 어드레서블로 클라우드 콘텐츠 전송>
라이브 게임을 운영 중이라면 Unity의 CCD(클라우드 콘텐츠 전송)와 어드레서블을 함께 사용해보세요. 어드레서블 시스템은 게임 에셋을 자동으로 찾고 호출할 수 있도록 저장 및 분류합니다. CCD는 해당 에셋을 플레이어에게 직접 푸시하며, 이는 코드와 완전히 무관하게 이루어집니다. 따라서 빌드 규모가 감소하며, 게임이 업데이트될 때마다 플레이어가 새 버전을 다운로드하고 설치할 필요가 없습니다. 자세한 내용은 어드레서블과 클라우드 콘텐츠 전송 간의 통합을 다룬 이 블로그 포스팅을 참조하세요.
<프리 프로세서 지시문으로 컴파일 제어>
플랫폼별 컴파일기능을 사용하면 스크립트를 분할하여 특정한 플랫폼을 대상으로 코드를 컴파일하고 실행할 수 있습니다.
이 예시에서는 기존의 플랫폼#define지시문과#if컴파일러 지시문을 사용합니다.
using UnityEngine;
using System.Collections;
public class PlatformDefines : MonoBehaviour
{
void Start ()
{
#if UNITY_EDITOR
Debug.Log("Unity Editor");
#endif
#if UNITY_IOS
Debug.Log("Iphone");
#endif
#if UNITY_STANDALONE_OSX
Debug.Log("Stand Alone OSX");
#endif
#if UNITY_STANDALONE_WIN
Debug.Log("Stand Alone Windows");
#endif
}
}
DEVELOPMENT_BUILD#define을 사용하여Development Build옵션으로 빌드된 플레이어에서 스크립트가 실행 중인지 여부를 식별합니다.
특정 Unity 버전이나 스크립팅 백엔드를 대상으로 선택적으로 컴파일할 수 있으며, 에디터에서 테스트할 때 고유의 커스텀 #define 지시문을 제공할 수도 있습니다.Player 설정의 일부인Other Settings패널을 열고Scripting Define Symbols로 이동합니다.
스크립터블 오브젝트는 클래스 인스턴스와 별개로 대량의 데이터를 저장하는 데이터 컨테이너입니다. 스크립터블 오브젝트는 값이 복사되는 것을 방지하므로 프로젝트의 메모리 사용량을 줄일 수 있습니다.전자책 본문에서 스크립터블 오브젝트 사용 방법에 대한 예시를 확인하세요.ScriptableObject 기술 자료를 통해서도 애플리케이션에서 스크립터블 오브젝트를 사용하는 자세한 방법을 확인하실 수 있습니다.
저장된 데이터에는 JSON이나 XML과 같은 텍스트 기반 포맷이 아닌MessagePack이나Protocol Buffers와 같은 이진 직렬화 포맷을 사용하는 것이 좋습니다. 프로젝트 리뷰에서 이진 직렬화 포맷을 사용하면 텍스트 기반 포맷과 관련된 메모리 및 성능 문제를 줄일 수 있습니다.
Windows와 macOS에 Unity를 설치하면 기본적으로 Visual Studio가 설치됩니다. 다른 IDE를 사용하고 싶다면Unity > Preferences > External Tools > External Script Editor에서 에디터를 찾아보세요.
Rider는ReSharper를 기반으로 빌드되었으며 ReSharper의 기능 대부분을 포함합니다. 그리고 Unity의 .NET 4.6 스크립팅 런타임이 C# 디버깅을 지원합니다(C# 8.0). 자세한 내용은Unity용 Rider에 대한 JetBrains의 기술 자료를 참조하세요.
Unity 디버거를 사용하면 Unity 엔티티(Entity)가 플레이 모드일 때 C# 코드를 디버깅할 수 있습니다. 코드 에디터 내에 중단점을 연결하여 런타임 시 스크립트 코드의 상태와 현재 변수를 검사할 수 있습니다.
Unity 에디터 상태 표시줄의 우측 하단에서 Code Optimization 모드를Debug로 설정합니다.Edit > Preferences > General > Code Optimization On Startup을 사용하여 시작할 때 이 모드를 변경할 수도 있습니다.
디버그 모드
코드 에디터에서 디버거가 실행을 일시 중지할 중단점을 설정합니다. 중단점을 토글하려는 위치에서 왼쪽 여백/거터 영역을 클릭하면 됩니다(여기에서 우클릭할 경우 다른 옵션에 대한 컨텍스트 메뉴를 확인할 수 있음). 강조 표시된 줄의 줄번호 옆에 빨간색 원이 나타납니다(아래 이미지 참조).
중단점 토글하기
코드 에디터에서Attach to Unity를 선택한 다음, Unity 에디터에서 프로젝트를 실행합니다.
Unity에 디버거 연결하기
플레이 모드에서 애플리케이션은 중단점에서 일시 중지되며, 변수를 점검하고 의도치 않은 동작을 검사할 시간을 제공합니다.
변수 디버깅
위에서 보는 바와 같이 디버깅 시 실행 중에 한 번에 한 단계씩 쌓이는 목록을 참고하여 변수를 점검할 수 있습니다.
Continue Execution,Step Over,Step Into,Step Out옵션을 사용하여 제어할 수 있습니다.
디버그 제어: Stop(중지)
디버깅을 중지하려면Stop을 누르고 에디터에서 실행을 재개합니다.
Unity 플레이어에서도 스크립트 코드를 디버깅할 수 있습니다. 플레이어를 빌드하기 전에File > Build Settings에서Development Build와Script Debugging이 모두 활성화되어 있는지 확인하세요. 플레이어가 스크립트 코드를 실행하기 전에 디버거를 기다리려면Wait for Managed Debugger에 체크 표시합니다. 코드 에디터를 Unity 플레이어에 연결하려면 플레이어의 IP 주소(또는 머신 이름)와 포트를 선택합니다. 그런 다음 Visual Studio에서Attach To Unity옵션을 사용하여 일반적인 방법으로 진행합니다.
반응형
<추가 디버깅 팁>
Unity는 에디터가 실행되는 동안 정보를 시각화하는 데 도움이 되는디버그클래스를 제공합니다. 콘솔 창에 메시지나 경고를 표시하는 방법, 씬과 게임 뷰에서 시각화 선을 그리는 방법, 그리고 스크립트로 에디터에서 플레이 모드를 일시 중지하는 방법에 대해 알아보세요. 다음은 유용한 몇 가지 추가 팁입니다.
Debug.Break로 실행을 일시 중지합니다. 애플리케이션을 수동으로 일시 중지하기 어려운 경우, 인스펙터에서 특정 값을 확인할 때 이 방법이 유용합니다.
Debug.Log를 사용하면 오브젝트를 컨텍스트로 전달할 수 있습니다. 콘솔에서 메시지를 클릭하면 계층 창에 게임 오브젝트가 강조 표시됩니다.
리치 텍스트를 사용하여Debug.Log문에 마크업 태그를 적용할 수 있습니다. 이는 콘솔에서 오류 리포트를 개선하는 데 유용합니다.
Unity는 비개발 빌드에서디버그로깅 API를 자동으로 제거하지 않습니다.디버그 로그호출을 커스텀 메서드로 래핑하고[Conditional]속성을 추가하세요. 디버그 로그를 모두 한 번에 컴파일하려면 플레이어 설정에서 해당하는스크립팅 정의 기호를 제거하세요. 이는 디버그 로그를 #if… #endif프리 프로세서 블록으로 래핑하는 것과 동일합니다. 자세한 내용은일반 최적화가이드를 참조하세요.
Development Build가 활성화된 경우에만 코드를 실행하려면Debug.isDebugBuild가 true를 반환하는지 확인하세요.
Application.SetStackTraceLogType을 사용하거나 플레이어 설정에서 해당 옵션을 체크하여 스택 추적을 포함할 로그 메시지 유형을 결정하세요. 스택 추적은 유용하게 사용할 수 있지만, 속도가 느리고 가비지를 생성합니다.
<선호도에 따른 Console Log Entry 설정>
기본적으로 Console Log Entry는 두 줄로 표시됩니다. 하지만 간단히 한 줄로 표시하여 가독성을 높일 수 있습니다. 아래와 같이 하면 됩니다.
반응형
<컴파일러 상태 커스터마이즈>
Unity에서는 컴파일 중에 우측 하단 모서리에 있는 아이콘이 잘 보이지 않을 수 있습니다. 이 커스텀 에디터 스크립트를 사용하여EditorApplication.isCompiling을 호출하세요. 그러면 플로팅 창이 생성되어 컴파일러 상태를 더 분명하게 볼 수 있습니다.
MenuItem을 실행하여 창을 초기화하세요. 새로운 GUIStyle을 이용하면 원하는 방식으로 외관을 바꿀 수 있습니다.
using UnityEditor;
using UnityEngine;
public class CustomCompileWindow : EditorWindow
{
[MenuItem("Examples/CustomCompileWindow")]
static void Init()
{
EditorWindow window = GetWindowWithRect(typeof(CustomCompileWindow), new Rect(0, 0, 200, 200));
window.Show();
}
void OnGUI()
{
EditorGUILayout.LabelField("Compiling:", EditorApplication.isCompiling ? "Yes" : "No");
this.Repaint();
}
}
<소스 관리>
Unity는Perforce와Plastic SCM, 두 가지 VCS(Version Control System, 버전 관리 시스템)와 통합됩니다. Unity 프로젝트에 Perforce나 Plastic SCM 서버를 설정하려면Project Settings > Editor로 이동합니다. 그리고Version Control에서 서버를 설정합니다(Perforce의 경우 사용자 자격 증명도 설정해야 함).
버전 관리를 사용하도록 프로젝트 설정
Unity를 사용하는 팀은 Plastic SCM Cloud Edition을 스토리지 용량 5GB에 사용자 3명까지 무료로 사용할 수 있습니다. Unity용 Plastic SCM을 사용하면 Unity 내에서 수정한 사항과 다른 팀원이 작업한 내용을 동기화하고 프로젝트 이력을 열람할 수 있습니다. Plastic SCM의 최근 업데이트에 대한 내용은이 블로그를 참조하세요.
Git LFS(Large File Support)를 포함한 Git과 같은 외부 시스템을 사용하여 그래픽스나 사운드 리소스와 같은 대규모 에셋의 버전을 보다 효율적으로 관리할 수 있습니다. GitHub 호스팅 서비스를 보다 편리하게 사용하려면Unity용 GitHub 플러그인을 설치합니다. 이 오픈 소스 확장을 통해 프로젝트 이력을 살펴보고, 브랜치에서 실험할 수 있습니다. 또한 변경 사항을 커밋하고, GitHub로 코드를 푸시하는 등 모든 작업을 Unity 내에서 수행할 수 있습니다.
Unity는.gitignore 파일을 유지 관리합니다. 이러한 방식은 Git 저장소에서 보관하거나 보관하지 말아야 할 항목을 결정하고, 규칙을 적용하는 데 도움이 됩니다.
Unity용 GitHub 확장 기능
Unity Teams는 워크플로를 간소화하는 또 다른 옵션으로, 이를 통해 클라우드에 전체 프로젝트를 저장할 수 있습니다. 어디서나 백업하고 액세스할 수 있으므로 보다 수월하게 Unity 프로젝트를 저장하고, 다른 사람과 공유 및 동기화할 수 있습니다.
댓글