
오늘 학습 키워드
최종 팀 프로젝트
오늘 학습 한 내용을 나만의 언어로 정리하기
OpenGL 환경으로 그래픽 시뮬레이션을 해보기
- ProjectSettings > Player > Settings for Windows, Mac, Linux > Other Settings
- Graphics APIs for Windows > OpenGLES3 을 맨 위로
- 근데 2022.3.62f 버전에 이 항목은 안보였음
WebGL 빌드에서 프리팹이 자꾸 머터리얼이 깨지는 문제
- 해결 시도 중
- 시도 한 방법들
- Always Included Shaders에 추가하기
- Edit > Project Settings > Graphics > Always Included Shaders 에 추가
- 실패
- Addressables에 쉐이더를 넣어서 빌드하기
- 실패
- Shader Variant Collection을 만들기
- 실패
- (꼼수) Init Scene에 일부러 Shader를 사용하는 Square를 하나 만듬
- 그래도 실패
- (with Chatgpt) URP Asset을 Addressables 빌드 시 강제 활성화
- 실패
public static class ForceURPBuild
{
[InitializeOnLoadMethod]
static void EnsureURPActiveForBuild()
{
var urpAsset = GraphicsSettings.renderPipelineAsset as UniversalRenderPipelineAsset;
if (urpAsset == null)
{
// 만약 에디터 실행 중 URP Asset이 비어 있다면 자동 지정
var found = AssetDatabase.FindAssets("t:UniversalRenderPipelineAsset");
if (found.Length > 0)
{
var path = AssetDatabase.GUIDToAssetPath(found[0]);
urpAsset = AssetDatabase.LoadAssetAtPath<UniversalRenderPipelineAsset>(path);
GraphicsSettings.renderPipelineAsset = urpAsset;
QualitySettings.renderPipeline = urpAsset;
Debug.Log($"[ForceURPBuild] URP Asset 강제 지정: {path}");
}
else
{
Debug.LogWarning("[ForceURPBuild] URP Asset을 찾을 수 없습니다. URP가 활성화되지 않은 상태로 Addressables이 빌드될 수 있습니다.");
}
}
}
}-
이 당시 팀원 분과 얘기했던 내용

-
답을 모르겠어서 결국 유니티 디스커션에 글을 남김 내가 쓴 글
-
테스트 : Addressable로 임시 사각형을 타이틀 씬에 출력해보도록 했음
- 에디터 씬에선 핑크로 깨짐
- 근데 빌드에서는 안깨짐!! 이게 무슨일이지
- 라이브러리 폴더를 지우고 엔진 껐다 키기
- 팀원분이 알려주심

- 팀원분이 알려주심
-
해결됨!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
그러나 또 다른 문제가 있었으니…
WebGL 빌드에서 비동기로 데이터를 가져오는게 안됨
- LoadingScene에서 70% 쯤 되었을 때 다음으로 안넘어가졌음.
- 팀원분이 뜯어본 결과 비동기로 데이터 불러오는 부분이 문제인 것 같다고 하심
- 그래서 찾아보던 중, WebGL에서는 안되는게 몇 개 있다는 사실을 알아냄!
- 참고 자료
- 가장 충격적인건 try-catch가 안된다는 것. (근데 구글링 해보니 된다는 말도 있고..?)
- 그리고 Task 메소드들이 싹 다 안되는 듯
해결 방법 : UniTask!
- 유니태스크를 사용하면 빌드 시 크기가 2mb정도 는다고 함
그럼 왜 UniTask는 괜찮은건가?
-
참고 자료들
-
일단 UniTask의 장점을 모아보자
- UniTask는 struct base임. (C# Task는 class base.) ⇒ zero allocation ⇒ 힙에 할당 안되니까 가볍다! (이게 근데 제일 큰 장점인 듯)
- 유니티의 Async Operations를 그대로 await로 대기 가능
- UniTask는 >내부적으로 풀링 매커니즘ㅁ을 쓰고있음!<
- (코루틴은 안되는데) UniTask는 내부에서 문제가 생겼을 때 Try-Catch로 판단이 가능함
- 이 외에도 많음…
-
그래서 왜 UniTask는 괜찮은가?
- 일단 UniTask는 기본적으로 유니티와 통합되어있음.
- 심지어 UniTask.Delay를 쓰면 Unity Time.timeScale을 기준으로 기다려줌.
- >> 싱글 쓰레드 기반으로 유니티 메인 쓰레드에서 동작하도록 설계됨 <<
(딴 얘기) Task.Delay는 유니티 메인 스레드에서 작동하는가?
- 답은 (아마) 아님.
- .Net 공식 Task.Delay 문서
- 특정 시간을 기다리는 Task를 만듦.
- ⇒ 메인 스레드에서 실행된다는 보장이 없음.
- 애초에 Unity API가 아니고 .Net에 포함되는 함수임.
WebGL에서 UGS Login이 안됨
- 혹시 몰라서 Task → UniTask로 바꿔봤는데도 안된다고 하심
- 예전에 했을 때는 Google Cloud Platform 통해서 로그인 시도했을 때 안된다고 하심
- 그래서 OpenID 써서 전에 쓰던 Firebase 인증 시스템이랑 연동해서 할까 했는데, 그냥 WebGL은 익명 로그인만 가능하도록 설정하자고 얘기 나와서… 포기.
이번 주말에 겪은 일 정리
- 일단 에디터에서 쉐이더 로드가 깨졌었음.
- 이건 Library 폴더 삭제 후 다시 로드하는 걸로 해결했음.
- 에디터는 괜찮은데 빌드에서 로딩창 이후로 안 넘어갔음.
- 어드레서블 데이터 불러오는 작업을 Task를 사용하다보니 멀티쓰레드가 된 것 같음
- 근데 WebGL은 멀티쓰레드 지원 안함
- 그래서 문제 생김
- ResourceManager 작업하신 팀원분께서 Task를 UniTask로 바꾸는 작업 시도하시는 중
- WebGL로 UGS 로그인이 안됨.
- 그냥 웹은 익명 로그인만 가능하도록 하자…