일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Cell Shader
- AppSW
- C언어
- Three(Two) Tone Shading
- Specular
- 작업 집합
- 3d
- 메모리 누수
- VR
- Virtual Byte
- Rim Light
- working set
- OculusMotionVectorPass
- 벡터
- 프로그래밍 기초
- Toon Shader
- Cell Look
- Windows Build
- Private Bytes
- Cartoon Rendering
- ASW(Application SpaceWarp)
- 가상 바이트
- URP로 변경
- ColorGradingLutPass
- URP
- 게임 수학
- 개인 바이트
- Today
- Total
WinCNT
Unity Assembly Definition를 설정해보기 본문
서론
커스텀 셰이더에 대해서 커스텀 GUI를 작성하고 Assets > Editor 파일에 저장한 적이 있었다
일반적인 경우라면 이걸로 끝이었겠지만, 문제는 커스텀 셰이더가 Packages에 있는 일종의 커스텀 패키지였다는 점이었다
이 같은 경우에는 Assembly Definition이란 것을 만들고 설정해야 한다는 이야기를 사수한테 들어서 실제로 해본 내용을 정리해보려고 한다
Script will not be compiled because…
Assets > Editor에 있던 스크립트를 Packages/대충 커스텀 패키지 폴더/Edior로 옮겨보니 다음과 같은 경고가 발생했다
💡 Script 'Packages/대충 커스텀 패키지 폴더/Edior/대충 커스텀 셰이더 GIU.cs' will not be compiled because it exists outside the Assets folder and does not to belong to any assembly definition file.
대충 번역하자면 “이 스크립트는 Assets 폴더 밖에 있으며, 어떠한 assembly definition file에도 속해있지 않기 때문에 컴파일되지 않습니다” 정도가 될 것이다
아무튼 역시 assembly definition가 필요한 것은 확실한 것 같다
Assembly Definition(어셈블리 정의)란?
우선 Assembly Definition(어셈블리 정의)가 무엇인지에 대해서 찾아봤다
💡 유니티 공식 문서
어셈블리 정의 및 어셈블리 레퍼런스는 스크립트를 어셈블리로 구성할 수 있는 에셋
💡 Qiita에서 찾은 글(URL은 참고 사이트에 있음)
어셈블리 정의는 C#의 빌드 파일(어셈블리)을 분할해서 출력하는 기능
특히 유니티에서 라이브러리나 C#에셋을 만들 때 거의 필수
정확히는 Assembly Definition이란 용어는 그 기능에 대한 명칭이고, 실제로 유저가 Assembly Definition을 사용하기 위해 정의하는 파일을 Assembly Definition Files(줄여서 asmdef, 혹은 adf)라고 부른다고 한다
Unity는 기본적으로 대부분의 스크립트를 Assembly-CSharp.dll라는 미리 정의한 어셈블리로 컴파일하지만, adf로 정의한 스크립트는 별도의 dll로 출력되므로 모듈성과 재사용성이 올라간다
Assembly Definition File를 만드는 것 자체는 간단
커스텀 패키지부터 만드는 것이면 복잡했겠지만 이번에는 이미 패키지가 있으니 이쪽은 생략!
(일단 커스텀 패키지 생성에 대한 도큐먼트는 첨부)
만드는 법은 대상 폴더 > 마우스 오른쪽 버튼 > Create > Assembly Definition하면 끝!
error CS0246 발생
그렇게 생각하던 시기가 저에게도 있었습니다…
asmdef를 추가하니 다음의 에러가 발생했다
error CS0246: The type or namespace name 'MaterialHeaderScopeList' could not be found (are you missing a using directive or an assembly reference?)
원인은 다른 곳에서 정의한 MaterialHeaderScopeList라는 클래스를 셰이더 GUI 작성에 사용했기 때문이다
이 경우는 Assembly Definition References를 통해서 MaterialHeaderScopeList가 있는 adf를 참조할 수 있도록 추가하고 Apply를 해줘야 한다
참고로 해당 클래스(스크립트)가 어느 adf에 속해 있는지는 스크립트의 인스펙터에 나와있다
그리고 이번에는 에디터 확장이기 때문에 다음에도 체크해줬다
Does the custom editor specified include its namespace?
그럼에도 불구하고 실제로 그 셰이더를 설정한 머티리얼을 클릭하면 다음과 같은 느낌의 경고가 뜨면서 커스텀 GUI로 표시되지 않았다(디폴트의 GUI가 표시됨)
Could not create a custom UI for the shader 'Basic/CustomShader'. The shader has the following: 'CustomEditor = CustomBasicShaderGUI'. Does the custom editor specified include its namespace? And does the class either derive from ShaderGUI or MaterialEditor?
처음에는 namespace에 문제가 있는 것으로 생각해서 삽질을 했다
(커스텀 에디터가 ShaderGUI에서 파생한 클래스인 것은 명확하니 그 문장은 무시)
하지만 그 이전의 문제였다
Assembly Definition의 공식 문서에는 Editor 코드에 대한 설명이 있다
Unity - Manual: Assembly definitions
아래는 거기서 문장이 발췌한 설명인데, 현재 2번에 대한 설정을 빼먹었다는 것을 깨달았다
💡 Creating an assembly for Editor code
- Create a platform-specific assembly in a folder containing your Editor scripts.
- Include ONLY the Editor platform.
- If you have additional folders containing Editor scripts, create Assembly Definition Reference assets in those folders and set them to reference this Assembly Definition.
공식 문서에 따라서 Any Platform의 체크를 해제하니 해당 경고가 사라졌고 잘 작동하게 됐다
(물론 당연한 얘기지만 namespace 지정이 잘못된 경우는 체크를 해제해도 경고가 발생한다)
마무리
처음에는 Assembly라는 단어가 있길래 hoxy…어셈블리어와 관련된 무언가인가?라고 두려움에 떨었는데 딱히 어셈블리어가 나오지는 않았다
어폐가 있을 순 있지만, 쉽게 말해 dll를 쉽게 나눌 수 있게 해주는 기능이라고 보면 될 것 같다
예전에 자체 엔진 만들면서 공부할 때는 dll 하나 설정하고 만들고 사용하는 것 자체가 뼈빠지는 일이었는데…역시 Unity는 갓 게임 엔진이 맞는 것 같다
참고 사이트
Unity Assembly Definition 完全に理解した - Qiita
'Unity > Unity 관련' 카테고리의 다른 글
윈도우의 CMD(Command Prompt)로 Unity의 Editor 스크립트의 메소드 실행하기! (0) | 2023.09.15 |
---|---|
유니티에서 빌드 직전, 직후에 실행되는 스크립트 작성하기!! (0) | 2023.08.25 |
유니티 간단 팁) 빌드 리포트(Build Report) 보는 법! (0) | 2023.08.08 |
유니티 프로퍼티의 할당 체크를 == null외의 방법으로 해보기 (0) | 2023.08.03 |
Unity에서 Slack으로 파일 업로드 해보기 (0) | 2023.07.27 |