게임 개발 공부 17

빌드 리포트 인스펙터(Build Report Inspector)

빌드 apk 파일이 스토어에 올릴 수 있는 150MB를 넘어가서 Addressable로 전환하는 과정에 빌드에 포함되는 리소스가 어떤 것이 있는 알고 싶어져서 찾아보았다. 유니티 제공하는 SDK 중 Experimental로 제공하는 Build Report Inspector가 있어서 사용하였다. 에디터 버전 : 2022.3.37fSDK 버전 : Build Report Inspector 0.3.0-preview Experimental이기에 UPM(Unity Package Manager)에서 바로 받을 수 없고 아래와 같이 Add package by name을 통해 추가해서 받아야 한다.  Package name에 com.unity.build-report-inspector 를 입력하고 Add 버튼을 누르면 설..

LayerMask를 이용한 Layer 비교(feat.충돌 처리)

유니티에서 제공하는 LayerMask를 통해 해당 레이어와 오브젝트의 레이어를 비교한 뒤 충돌 처리를 하고자 한다. LayerMask는 레이어 전체 또는 다수의 레이어를 선택할 수 있는 Flag 이기 때문에 단순 비교연산자 '==' 으로 비교할 수 없으며, 비트 연산자 '&' 를 사용해야 한다. using UnityEngine;public class LayerMaskSample : MonoBehaviour{ public LayerMask targetLayerMask; private void OnTriggerEnter(Collider other) { if ((targetLayerMask & (1

Unity Script에서 HEX(Hexadecimal) 값으로 Color 변환하는 법

유니티에서 일반적으로 RGB 값 할당하여 Color를 가져온다. 예를들어 위의 Color 값을 가져오기 위해서 아래와 같이 코드로 작성하여 가져왔다. using UnityEngine; ... Color newColor = new Color(0.9622f, 0.8615f, 0.413f, 1f); 원하는 Color를 일일이 RGB 값을 써야한다는 것이 여간 불편한 일이 아니다. 이런 방식이 아닌 웹(HTML)에서 컬러 값을 가져올 때 사용하는 방식인 Hexadecimal(이하 HEX) 값을 사용하여 Color 값을 가져올 수 있다. 코드는 아래와 같이 작성하면 된다. using UnityEngine; ... Color setColor; ColorUtility.TryParseHtmlString("#7F7E83..

모델이 화면에 표시되는 과정

오브젝트 모델이 화면에 표시되려면 먼저 SRT 변환 행렬을 통해 위치와 회전, 스케일이 모두 변환되어야 한다. 오브젝트의 중심점을 기준으로 모델이 위치하는 것이 로컬스페이스(Local Space)이다. 모델이 로컬스페이스에서 모니터에 표시되기까지 5단계의 변환 행렬이 행해져야 한다. Local Space ↓ World Space ↓ View(or Camera) Space ↓ Projection Space ↓ Screen(or Viewport) Space

'ID3D11Device'와 'ID3D11DeviceContext' 사용

수많은 GPU(그래픽카드)에 대한 하드웨어적인 연결을 마이크로소프트와 GPU제조사가 하도록 하며, 개발자는 DirectX에서 제공하는 ID3D11Device와 ID3D11DeviceContext를 통해 제공하는 기능에만 신경쓰면 되도록 설계된 COM 객체이다. COM(Component Object Model) 은 "객체의 내부를 노출하지 않고, 응용 프로그램이 호출할 수 있는 함수들만 노출하는 모델"을 의미한다. 따라서 COM객체는 인터페이스를 통해 참조하여 내부 함수를 호출하도록 설계되어 있다. ID3D11Device* _device; ID3D11DeviceContext* _deviceContext; 이런 식으로 쌩?포인터로 사용하게 되면, AddRef 함수나 Release 함수에 접근할 수 있다. 여..

[Unity/Android] 구글 오류 Error Unity AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.games.Games

프로젝트 빌드에는 성공했지만 로그캣에 이와 같은 오류와 함께 GooglePlay 로그인 및 기능이 실행되지 않았다. Error Unity AndroidJavaException: java.lang.ClassNotFoundException: com.google.android.gms.games.Games 해결 방법(Unity2022.2.7f1 기준) 1. ProjectSetting/Player/Publishing Settings으로 접근 2. Minify에 Release와 Dubug를 체크 3. Build에 'Custom Proguard File' 체크 4. Assets/Plugins/Android 폴더에 접근 5. proguard-user.txt 파일을 열어서 아래의 내용을 추가 -keep class com..

유니티에서 얼리얼으로 전환 Part-1 (Unity to Unreal Fundamentals)

프로젝트 생성(4.72.2 기준) - 유니티의 UnityHub와 같이 에픽게임즈 런처를 통해 엔진을 설치하고 프로젝트를 생성할 수 있다. - 최근 UnityHub에서도 템플릿을 제공하고는 있지만 언리얼이 조금 더 다양한 템플릿을 제공한다. 원하는 템플릿을 선택하거나 기본을 선택한 후 다음을 누른다. - 프로젝트 세팅 화면에서 먼저 비주얼스크립팅(블루프린트)으로 제작할 지, 코드 기반으로 할 지를 선택한다. - 이후 나머지 프로젝트 환경 설정을 선택한 뒤, 프로젝트 위치를 지정 및 프로젝트명을 작성한 다음 프로젝트 생성을 누르면 프로젝트가 생성된다. - Third Person 템플릿으로 생성한 프로젝트의 화면이다. - 하단 콘텐츠 브라우저는 유니티에서의는 프로젝트 창과 동일하며, 유니티는 Assets 폴더..

int형 나누기 문제

캐릭터의 경험치 진행율?을 구하기 위해 현재 경험치(Int형)와 목표 경험치(Int형) 변수 2개를 나눗셈하여 float형 변수 progress에 받으려고 했다. 그러나 progress 값이 계속해서 0이 되는 결과값을 받았다. 이는 int와 float의 표현방식의 차이로 인해 발생하는 문제이다. 따라서 float형으로 받기 위해서는 아래 스크립트와 같이 어느 한쪽을 float형으로 바꿔줘야 한다. (int / float) 형태의 계산 방식을 사용해야 옳바른 값을 받을 수 있다. 양쪽 모두 float로 변환해도 무방하지만 한쪽만 해도 상관없다.

유니티 드로우콜

Draw Call - CPU가 GPU에게 연산 명령을 던져주는 것을 의미 - CPU와 GPU 는 병렬 관계로 처리하며, CPU가 GPU에게 명령을 던져줌으로 GPU가 랜더링과 같은 처리를 시작함 - CPU는 명령은 던져주고 나서 다시 자기 일을 처리하기 시작 - 만약 또 다시 CPU가 GPU에게 명령을 던져주려 할 때 GPU가 이전 처리가 완료되지 않았다면, CPU는 처리를 기다리게 됨 - CPU와 GPU는 서로 다른 프로세스 유닛이기에 통신 비용이 발생 - 랜더링하기 전에 CPU에서 수많은 정보를 설정해줘야 함 ex) Vertex Buffer, Alpha Blending, Use Z-Buffer, Trasnform, Texture, Shader, Change States, Draw 등 Command B..