나는 문뜩 궁금해졌다. SRP Batch는 같은 Shader를 공유하는 메테리얼을 사용하면 드로우콜 비용이 줄어든다는 것 알게 된 이후 그렇다면 왜 굳이 Texture Altas를 사용하는 것인지? 너무 궁금해졌다. 왜냐하면 어차피 같은 Shader를 사용하면 다른 메테리얼 사용해도 SRP Batch덕분에 드로우콜 비용이 줄어드니깐 Texture Atlas를 사용해서 굳이 메테리얼을 하나로 만들어서 사용할 필요가 있을까? 야이 바보야 메테리얼 하나당 드로우콜 하나가 발생하는거잖아! 어느 정도 맞는말이다. Draw Call이란 것은 DP Call + Render State인데 DP Call은 무시하고 다른 메테리얼을 사용한다는 것은 다른 Render State를 사용한다는 것이므로, 같은 Shader를 사..
Spline이란?Spline은 곡선을 나타내기 위한 수학적 표현으로, 객체를 경로를 따라 이동시킬 때 사용됩니다. 스플라인의 기본 개념은 여러 제어점(Control Points)을 이용해 곡선을 만들어 내고, 곡선을 따라 객체가 움직이도록 하는 것입니다. 곡선은 정규화 값(normalized value), 즉 0에서 1까지의 값을 사용해 스플라인 상의 특정 위치를 계산할 수 있습니다. 정규화 값이 0이면 스플라인의 시작점, 1이면 끝점을 나타냅니다. Spline의 특정 위치를 계산하기public Vector3 GetPositionOnSpline(int splineIndex, float normalizedPosition){ //spline Index : 얻고자 하는 Spline if (splineIn..
TMI : Texture Baker는 자식으로 Mesh Baker 컴포넌트를 가지고 있는데요, Baker컴포넌트를 통해 새롭게 만들어진 Mesh의 트라이들은 소스 텍스처 대신 새롭게 생성된 아틀라스 텍스처를 참고해야 하도록 UV를 수정해야하기 때문입니다.요약하면, 메시를 베이킹할 때 UV를 변환하여 결합된 메시가 소스 메시와 동일하게 보이도록 해야 합니다.Texture Baker컴포넌트에는 다양한 옵션들이 존재합니다. 하나씩 차근차근 알아보겠습니다. MB3_Texture Baker컴포넌트는 여러 개의 메쉬와 텍스처를 결합하여 하나의 텍스처 아틀라스(혹은 다중 텍스처 아틀라스 )로 만드는 기능을 제공합니다. Texture Baker 컴포넌트를 사용시 지침은 다음과 같습니다.좋은 결과를 위해 같은 셰이더를..
코드를 최적화하려면 여러 가지 기술을 사용해야 합니다. 그중 하나가 인라인화(inlining)입니다. 인라인화는 간단하게 말해, 메서드 호출을 제거하고 해당 메서드의 코드를 호출 위치에 직접 삽입하는 최적화 기법입니다. C#에는 인라인화를 강력히 권고하는 속성(Attribute)이 있는데, 바로 MethodImplOptions.AggressiveInlining입니다. 이번 포스팅에서는 MethodImplOptions.AggressiveInlining 속성에 대해 간단하게 알아보겠습니다. MethodImplOptions.AggressiveInlining란?AggressiveInlining은 C#의 MethodImplOptions 열거형(enum)의 값 중 하나입니다. AggressiveInlining 속성..
저는 Mathf.Sign를 Sine함수와 헷갈리는 바람에... 약간 머리가 아팠네요 하하 Sign은 Sine함수가 아닌 Sign(부호)를 나타냅니다. /// /// Returns the sign of f. /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float Sign(float f) => (double) f >= 0.0 ? 1f : -1f;public static float Sign(float f) => (double) f >= 0.0 ? 1f : -1f; Sign 함수는 값을 받아와서 값이 양수면 1을, 음수면 -1을 돌려줍니다. private float SnapInput(fl..
옵저버 패턴과 유사하다고 짚고 넘어가겠습니다. 이번 포스팅에서는 이벤트 관리 시스템을 제네릭 타입을 사용하여 구현하였습니다.제네릭을 사용함으로써 다양한 타입의 데이터를 유연하게 처리할 수 있으며, 여러 이벤트에 맞는 데이터를 효율적으로 전달하는 방법에 대해 알아보겠습니다.제네릭을 사용한 EventManager 구현public class EventArgs : EventArgs{ public T Data { get; } public EventArgs(T data) { Data = data; }}EventArgs는 제네릭 타입을 사용하여 데이터를 담을 수 있습니다. 이벤트가 발생할 때, 특정 타입의 데이터를 전달할 수 있도록 합니다. EventArgs를 상속받는 이유는 .NE..
시네머신을 이용하면 코딩 한 줄 없이 다양한 상황을 쉽게 연출할 수 있습니다. 시네머신은 종류도 많고 Extenstion 종류도 많기에 이번 포스팅에서는 간단하게 Dolly Track, Dolly Cart, Virtual Camera, Blend List Camera 4가지 종류에 대해서만 말해보고자 합니다.Virtual Camera를 활영한 기법들ChinemachineVirtualCamera컴포넌트에는 다양한 프로퍼티 및 옵션이 존재합니다. 하나씩 표로 살펴보겠습니다. 속성명 설명 Status카메라 상태를 나타냅니다. 예시로 "Live"는 현재 이 가상 카메라가 활성 상태임을 의미합니다.Game Window Guides게임 창에서 카메라의 시각적 가이드라인을 표시할지 여부를 선택할 수 있습니다.Sa..
물리적인 이동을 구현할 때, 이동 속도를 프레임 시간과 곱해 이동 거리를 계산하는 것은 일반적인 방법입니다. 하지만 동일한 수식을 작성할 때, 연산 순서에 따라 성능에 차이가 발생할 수 있다는 사실을 알고 계셨나요?코드 예시를 통해 차이를 설명하고, 최적화하는 방법을 알아보겠습니다.연산 순서 이해하기rigidbody.MovePosition(rigidbody.position + moveDir * Speed * Time.fixedDeltaTime);rigidbody.MovePosition(rigidbody.position + moveDir * (Speed * Time.fixedDeltaTime)); 이때 moveDir는 벡터(Vector)이며 Speed는 스칼라(Scala) 값입니다. 첫 번째 줄의 코드는..
자주 사용하는 함수- DoRestart : 트윈을 처음부터 다시 시작- DoRewind : 트윈을 거꾸로 재생하여 처음 상태로 되돌림두 개의 함수를 이용해서 주로 UI 애니메이션 만들곤 함. 함수 이름 설명 DOComplete()트윈을 즉시 완료 상태로 만듭니다. 트윈이 바로 끝나고 완료 콜백이 호출됩니다.DOKill()트윈을 즉시 중지하고, 관련된 모든 리소스를 해제합니다.DOKillById(string id)지정된 ID를 가진 트윈만 중지하고, 관련된 리소스를 해제합니다.DOPause()트윈을 일시 중지합니다.DOPauseAllById(string id)지정된 ID를 가진 모든 트윈을 일시 중지합니다.DOPlay()트윈을 재생합니다.DOPlayById(string id)지정된 ID를 가진 트윈만..
TextMeshPro-Text (UI) 컴포넌트는 Text Input에 태그를 이용해서 Text를 꾸밀 수 있다는 것을 알고 계시나요?이번 포스팅에서는 TextMeshPro-Text (UI)에 사용할 수 있는 태그 몇 가지와 사용 방법에 대해서 말해보겠습니다. 텍스트 스타일 관련 태그 태그 설명 사용 예시 텍스트를 굵게 표시Bold Text텍스트를 기울임체로 표시Italic Text텍스트에 밑줄을 그림Underlined Text텍스트 색상 및 크기 관련 태그 태그 설명 사용 예시 텍스트 색상을 지정 (HEX 코드 사용 가능)Red Text텍스트 크기를 지정Large Text텍스트에 하이라이트(배경색)을 지정Highlighted Text 다음은 이쁜 색상 (계열)을 가져와봤습니다. 색상 이름 H..
라이팅 세팅에 가시면 Environment Lighting이라는 부분에 존재합니다.여기에서 Intensity Multiplier를 조절하시면 됩니다.
22년도에 Pool System에 대해서 언급한적이 있습니다. Pooling에 관한 내용은 아래 포스팅에 작성했으니 참고하시면 되겠습니다. 이때 소개한 Pool의 경우 하나의 오브젝트에 대해서만 관리할 수 있다는 단점이 있었습니다. Unity Pooling System (최적화 구웃!)Pooling이란? Unity의 풀링 시스템은 런타임 중에 게임 오브젝트를 효율적으로 관리하고 재사용하는 데 사용되는 기술로, 특히 총알, 적, 파티클과 같은 오브젝트를 자주 생성하고 소멸해야 할 때wlsdn629.tistory.com 이번 시간에는 Dictionary를 활용해서 하나의 오브젝트에 대해서만 관리하는 것이 아닌 2개 이상의 오브젝트를 관리할 수 있는 방법과 활용 방법에 대해 알아보겠습니다. 제목에서도 알 수 ..
APK 설치 위치는 auto(android:installLocation in AndroidManifest.xml)여야 합니다.APK 화면 방향이 가로가 아닙니다(AndroidManifest.xml의 android:screenOrientation).빌드를 하는데 자꾸 위와 같은 에러가 계속 발생해서 거의 며칠간 끙끙 앓았네요.... APK 설치 위치는 auto(android:installLocation in AndroidManifest.xml)여야 합니다. 해결하기 모바일 - Ohter Settings 탭에 Install Location을 Automatic으로 해줍니다. APK 화면 방향이 가로가 아닙니다(AndroidManifest.xml의 android:screenOrientation). 해결하기 R..
유니티에서도 Grid Layout Group 컴포넌트가 존재하긴 합니다. 하지만 해당 컴포넌트를 사용하면 각 행과 열의 Element이 Grid 형태에서 벗어나지 못한다는 문제가 있습니다(뭔 소리야 ㅋㅋ..그러려고 Grid Layout Group 컴포넌트 쓰는건데!) 워워... 그 뜻이 아니라 Grid란 사전 의미를 찾아보면 다음과 같습니다.수평선과 수직선이 교차해서 이루어진 집합체이다. 하나의 집합체는 세로 열을 그리고 다른 하나는 가로 행을 정의합니다. 각 요소는 이러한 열과 행으로 된 라인으로 배치할 수 있다. 즉, 위와 같은 조건을 충족만 하면 Grid라 할 수 있는거죠. 유니티의 Grid Layout Group 컴포넌트는 Grid 조건을 만족하지만 정해져 있는 모습을 벗어나지 못한다는 점입니다...
record 변수란?record는 C# 9.0에서 도입된 새로운 데이터 구조입니다. 주로 불변(immutable) 데이터 구조를 정의하는 데 사용되며, 값 기반 비교와 복사 기능이 내장되어 있습니다. record는 클래스와 비슷하지만, 데이터 저장 및 관리를 더 간편하게 해줍니다.클래스(Class)와의 차이점 불변성(Immutable)record는 기본적으로 불변 객체로 사용되므로 생성된 이후에는 객체의 상태를 변경할 수 없습니다.반면에 클래스는 가변 객체로, 생성 후에도 상태를 변경할 수 있습니다. 값 기반 비교record는 객체의 참조가 아닌 값을 기반으로 비교하므로 두 개의 record 객체가 동일한 값을 가지면 같은 것으로 간주됩니다.클래스는 참조 기반 비교를 사용합니다. 즉, 두 객체가 동일한 ..