[Unity 이슈] 커스텀 패키지 종속성 문제
·
유니티(Unity)/이슈 도감
📌 개요   [ Custom Package 제작하기 ] [Unity 기능] Custom Package 제작하기✍️ 개요  유니티를 사용해온 프로그래머라면 사용자 패키지(Custom Package)을 만들고 싶다는 생각이 든 적 있지 않나요? 저는 최근에 게임잼이나 신작을 준비할 때마다 빠르게 시작하기 위한gus6615.tistory.com  이전에 커스텀 패키지를 만드는 과정을 살펴봤었어요. 그런데 만약 여러분이 스크립트에서 Unity Package Manager을 사용했다면 종속성 문제가 발생했을거예요. 저는 커스텀 패키지에서 Addressable 패키지와 Unitask 패키지를 사용했는데 여기서 문제가 발생했거든요. 그래서 오늘은 종속성 문제를 해결하는 방법에 대해 알아보도록 하겠습니다.     ?..
[Unity 기능] 커스텀 패키지 제작하기
·
유니티(Unity)/커스텀 에디터
✍️ 개요 유니티를 사용해온 프로그래머라면 사용자 패키지(Custom Package)을 만들고 싶다는 생각이 든 적 있지 않나요? 저는 최근에 게임잼이나 신작을 준비할 때마다 빠르게 시작하기 위한 탬플릿이 있으면 좋겠다는 생각을 했습니다. 그래서 자주 사용하는 Manager 모듈을 탬플릿으로 제작하여 사용자 패키지로 만들었습니다. 혹시라도 저처럼 사용자 패키지를 제작하고 싶은 분들을 위해 과정을 공유하도록 하겠습니다.      📌 커스텀 패키지 레이아웃 설정  위 하이러키 구조가 유니티가 권장하는 커스텀 패키지 레이아웃입니다. 다소 복잡해보이지만 모두 구축할 필요는 없습니다. 그래서 저는 package.json, Editor, Runtime, Samples~만 구축하도록 하겠습니다. 만약 자세한 내용에..
[Unity 최적화] UI SetActive 호출 타이밍
·
유니티(Unity)/최적화 기법
✍️ 개요      📌 UI SetActive 최적화 방법 /// Bad Case (총 3회의 dirty 플래그 처리)Image img = GetComponent();img.gameObject.SetActive(true); //dirty 플래그 처리img.fillAmount = 1f; //dirty 플래그 처리img.transform.position = Vector3.zero; //dirty 플래그 처리/// Good Case (총 1회의 dirty 플래그 처리)Image img = GetComponent();img.fillAmount = 1f;img.transform.position = Vector3.zero;img.gameObject.SetActive(true); //d..
[Unity 최적화] 오디오(사운드) 최적화
·
유니티(Unity)/최적화 기법
📌 개요    게임에서 오디오 리소스는 많은 메모리 사용량을 차지하는 에셋 중 하나입니다. 특히 3D 환경을 지원하는 기능을 2D에서 사용하도록 설정하여 메모리 혹은 성능 최적화에 실패하기도 합니다. 그래서 오늘은 Unity에서 오디오를 최적화하는 방법에 대해 살펴보겠습니다.     📌 Audio Import 세팅 최적화  Force To Mono오디오를 단일 채널 사운드로 다운 믹싱합니다.입체 음향이 사라지지만 비약적으로 용량을 줄일 수 있습니다.단, 모노 음원이라면 아무런 영향이 없음3D 게임이 아니라면 체크합니다.Normalize : 사운드 정규화 (일반적으로 체크)단, 이미 사전에 볼륨 작업을 했다면 체크 해제  Load In Background비동기 방식으로 백그라운드에서 로딩됩니다.천천히 ..
[Unity 기능] Sprite Atlas에 대하여
·
유니티(Unity)/콘텐츠 기능
✍️ 개요 Unity에서는 빌드 용량의 대부분은 Texture가 차지합니다. 또한, 게임을 플레이하면서 메모리의 대부분을 차지하기에 최적화가 중요합니다. 그래서 유니티는 Texture을 효율적으로 처리하기 위해 Sprite Atlas를 사용합니다.    📌 Sprite Atlas란?  Sprite Atlas : 여러 개의 Texture를 단일 Texture로 결합하는 에셋  위 사진을 살펴보면 3개의 Texture을 살펴볼 수 있습니다.보물 상자 (159 * 150 크기)보물 더미 (87 * 67 크기)보물 한줌 (61 * 41 크기) 그리고 이 3개를 하나로 묶어 256 * 256 크기의 Sprite Atlas를 만들었습니다. 그런데 Sprite Atlas을 굳이 생성하고 사용하는 이유는 뭘까요?  ..
[Unity] 카메라와 컬링
·
유니티(Unity)/이론 정리
✍️ 개요   [ Model이 렌더링(Rendering)되는 과정 (1편) ] [Unity] Model이 렌더링(Rendering)되는 과정 (1편)✍️ 개요 Unity에서 특정 Model을 이동시키는 로직을 구현해보셨나요? 언뜻 보기에는 모델 자체가 이동되는 것처럼 보입니다. 하지만 실제로는 Model을 구성하는 여러 정점(Vertices)들이 이동한 뒤gus6615.tistory.com 이전에 Model을 렌더링하기 위해 CPU는 Draw Call을 통해 GPU로 렌더링에 필요한 정보인 Mesh, Material, Texture, Shader, DP Call을 전송한다는 것을 확인했습니다. 여기서 GPU는 가장 먼저 Mesh을 구성하는 정점들의 좌표계를 로컬 -> 월드 -> 뷰 -> 투영 -> 클립 ..
[Unity 최적화] UGUI 최적화
·
유니티(Unity)/최적화 기법
✍️ 개요 이번 글에서는 Unity UGUI와 관련하여 최적화하는 방법을 소개하도록 하겠습니다. 주로 현업에서 자주 사용하는 Text 또는 Image와 같은 컴포넌트 최적화에 대해 살펴보고, 어떤 컴포넌트는 지양해야 하는 지 등 컴포넌트 관련 최적화 방법을 살펴보겠습니다.    [ UI 시스템 설계 참고 ] [Unity 최적화] UI 시스템 설계📌 개요    Unity로 게임을 개발하면 UI 시스템은 반드시 필요한 요소 중 하나입니다. 하지만 많은 개발자 분들이 UI 시스템을 최적화하지 않고 설계하는 경우가 많습니다. 오늘은 Unity UI의 기gus6615.tistory.com UI 시스템 설계의 내용을 일부 포함하고 있습니다. 이번 포스터에서는 설계보다는 콘텐츠 개발 입장에서 최적화하는 법을 살펴보..
[Unity 최적화] UI 시스템 설계
·
유니티(Unity)/최적화 기법
📌 개요    Unity로 게임을 개발하면 UI 시스템은 반드시 필요한 요소 중 하나입니다. 하지만 많은 개발자 분들이 UI 시스템을 최적화하지 않고 설계하는 경우가 많습니다. 오늘은 Unity UI의 기본 동작 원리를 이해하고, UI 설계 최적화 결과를 분석하며 살펴보도록 하겠습니다.   📌 캔버스(Canvas) 분리  캔버스는 UI 요소를 나타내는 메시를 생성하고, UI 요소가 변경되면 메시를 재생성하며, 실제로 UI가 표시되도록 GPU에 드로우 콜(Draw Call)을 발행합니다. 여기서 문제점은 하나의 UI 요소가 변경되면 캔버스에 존재하는 모든 UI 요소의 메시를 재구축한다는 점입니다. 많은 개발자가 하나의 캔버스에 수천 개의 UI 요소를 배치하는데, 이 방법은 CPU 비용을 급증시킬 수 있..
[Unity 기능] 9-Slicing Sprite 제작
·
유니티(Unity)/콘텐츠 기능
📌 개요  게임을 개발하다보면 하나의 UI을 늘리거나 줄여서 재활용하고 싶은 경우가 있습니다. 하지만 늘리거나 줄이면 위처럼 텍스처가 깨지기 마련입니다. 그래서 각 비율에 맞는 UI을 새로 제작하여 추가하는 방법을 사용합니다.    하지만 이 방법을 사용하면 다음과 같은 문제가 발생합니다.비율에 따라 새로운 리소스를 제작하기 때문에 인건 비용 추가 발생새로운 리소스로 인한 용량 비용 증가다른 비율에 대한 확장성 제한  흐음... 하나의 UI 텍스처로 다른 비율의 UI을 마구마구 뽑아낼 순 없는걸까요?    하지만 우리 킹갓제너럴 유니티는 이미 해결책을 보유하고 있었다는 것! 바로 '9 슬라이싱 스프라이트' 입니다!!   📌 9-Slicing Sprite 란?  9-Slicing Sprite : 다양한..
[Unity] 직렬화가 되지 않는 문제
·
유니티(Unity)/이슈 도감
📌 개요 데이터가 직렬화 되지 않는 문제 해결책① 사용자 정의 클래스에 [Serializable] 속성을 추가했는지 체크② Dictionary 혹은 HashSet을 사용했는지 체크③ Getter/Setter 프로퍼티를 사용했는지 체크   📌 문제 분석 최근에 유저 데이터를 로컬에 저장하는 기능을 구현해봤습니다. 직렬화하여 Json 파일로 데이터를 저장하고 관리하는 작업이었어요. 이미 많이 구현해본 작업이라 빠르게 작업하고 있었는데...      ??? 왜 Json 파일에 Equipment 클래스가 보이지 않는거죠?! 분명 [Serializable] 속성을 붙여서 직렬화를 해줬는데? 과연 원인이 무엇이었을까요?    📌 원인 분석 및 해결책   정답은... Getter 프로퍼티가 원인이었습니다! Ge..