[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..
[Cinemachine] RPG 캐릭터 시점 구현
·
유니티(Unity)/패키지: Cinemachine 정리
✍️ 개요  원신과 같은 RPG 장르 게임에서 캐릭터 시점을 어떻게 구현하면 좋을까요? 이전에 Cinemachine을 이용하여 3인칭 시점을 구현한 적이 있습니다. 이때는 Cinemachine Follow 제어 모듈을 사용했는데, 사실 한계가 있습니다. 그래서 오늘은 좀 더 복잡한 설정이 가능한 모듈을 통해 RPG 캐릭터 시점을 구현해보겠습니다.  [ 과거 포스팅한 3인칭 시점 구현 ] [Cinemachine] 3인칭 시점 구현✍️ 개요 3인칭 시점은 Unity 3D 게임을 제작할 때 많이 사용합니다. 그래서 유니티는 Cinemachine 카메라에 3인칭 시점에 대한 제어를 제공하고 있어요. 오늘은 Cinemachine을 활용하여 3인칭 시점을gus6615.tistory.com   [ 오늘의 작업물 미리..
[Unity] SpriteAtlas GetSprite 함수가 동작하지 않는 문제
·
유니티(Unity)/이슈 도감
📌 개요 SpriteAtlas GetSprite 함수가 동작하지 않는 문제 해결책① GetSprite(string name)의 함수 인자가 Packed Sprite Name과 동일한지 체크② Project Settings - Editor - Mode 값이 Sprite Atlas V2 - Enabled 인지 체크   📌 문제 분석 private Sprite GetSprite(AtlasType atlasType, int id){ if (_loadedAtlasTypeDict.TryGetValue(atlasType, out SpriteAtlas atlas)) { return atlas.GetSprite($"{atlasType}_{id}"); } else { ..
[Unity] 마우스 좌표와 월드 좌표 변환 주의 사항
·
유니티(Unity)/이슈 도감
📌 개요 ScreenToWorldPoint 을 사용하여 객체를 생성했는데 객체가 보이지 않는 문제해결책① Input.mousePosition.z 값을 0 혹은 Mathf.Abs(Camera.main.transform.position.z)으로 설정   📌 문제 상황 private void Update(){ if (Input.GetMouseButtonDown(0)) { Vector3 mousePos = Input.mousePosition; CreateJemView(_camera.ScreenToWorldPoint(mousePos)); }} 코드 설명마우스 입력을 받아 [ mousePos ] 변수에 값을 저장[ mousePos ] 을 월드 좌표계로 변환하여 광물 생성..
[Cinemachine] 카메라와 오브젝트 충돌
·
유니티(Unity)/패키지: Cinemachine 정리
✍️ 개요 이전 포스터에서 3인칭 시점 가상 카메라를 생성한 적이 있습니다. [ 3인칭 시점 가상 카메라 구현 방법 ] [Cinemachine] 3인칭 시점 구현✍️ 개요 3인칭 시점은 Unity 3D 게임을 제작할 때 많이 사용합니다. 그래서 유니티는 Cinemachine 카메라에 3인칭 시점에 대한 제어를 제공하고 있어요. 오늘은 Cinemachine을 활용하여 3인칭 시점을gus6615.tistory.com  하지만 위 방식으로 생성한 3인칭 시점 가상 카메라는 벽을 뚧는 문제가 발생합니다. 그래서 저희는 충돌체를 생성하여 가상 카메라가 충돌을 감지하도록 할 필요가 있습니다.    📌 충돌체 추가하기  사실 이미 Starter Asset 에는 수많은 충돌체(Collider)가 존재합니다. 따로 충..
[Cinemachine] 타겟 기반 시점 구현
·
유니티(Unity)/패키지: Cinemachine 정리
✍️ 개요  다들 레이싱 게임 해보셨나요? 레이싱 게임을 구현하기 위해선 카메라를 어떻게 배치하면 좋을까요? 먼저 다음과 같은 조건이 필요합니다.카메라는 차를 따라 위치를 이동합니다.차가 왼쪽 또는 오른쪽으로 이동시 따라서 방향을 회전합니다.마우스의 입력에 영향을 받지 않습니다.다행히 시네머신에는 위 기능을 바로 구현할 수 있는 카메라가 있습니다.    또한 이 카메라는 레이싱 뿐만 아니라 Temple Run 게임에도 적용할 수 있습니다. 마우스의 입력을 받지 않고 타겟을 추적하는 경우 유용하게 사용할 수 있습니다. 그럼 이제 어떻게 구현하는지 살펴보도록 하겠습니다.   [ 오늘의 작업물 미리보기 ]     📌 구현 방법  가상 카메라를 추가해주세요. [ Cinemachine ] - [ Targeted..