}
유니티 SRP Batcher, 너 어디까지 허용되니?SRP Batcher가 “같은 셰이더 Variant(= Keyword 집합)” 만 묶어 준다는 사실은 많이 알려져 있지만, 무엇이 Variant를 갈라놓고 어디까지 다른 값을 허용하는지는 문서 곳곳에 흩어져 있습니다. 아래wlsdn629.tistory.com 정적배칭과 Draw Call에 대해서정적배칭을 사용하는 최적화 방법정적이란 말 그대로 움직이지 않는 것을 뜻하며, 움직이지 않는 정적 오브젝트에 활용하는 기법이다. 동일한 재질을 공유하는 오브젝트들을 일괄 처리해서 드wlsdn629.tistory.com Unity Static batcing이란? (실습)Static batcing(정적 배칭) 이란 드로우 콜을 줄이기 위해 움직이지 않는 메시를 결..
Object Pooling을 왜 써야 할까?런타임 중 매번 오브젝트를 생성하고 파괴(Instantiate / Destroy)하면 CPU 부하와 GC(가비지 콜렉션)가 크게 늘어납니다.Network 오브젝트도 예외는 아닙니다. Fusion에서 Spawn() / Despawn()을 호출할 때마다 내부적으로 Instantiate/Destroy가 일어나므로, 총알·적 몬스터처럼 빈번히 생성되는 오브젝트는 풀링이 필수적입니다. Unity Pooling System (최적화 구웃!)Pooling이란? Unity의 풀링 시스템은 런타임 중에 게임 오브젝트를 효율적으로 관리하고 재사용하는 데 사용되는 기술로, 특히 총알, 적, 파티클과 같은 오브젝트를 자주 생성하고 소멸해야 할 때wlsdn629.tistory.com ..
유니티 URP환경에서 OpenXR 환경 혹은 Meta XR환경에서 SPI(Single Pass Instance) 문제, 한 쪽 눈에만 렌더링 되는 문제를 두 가지 예제로 알아보겠습니다.그전에 SPI 등에 대한 개념은 아래 포스팅을 참고해주세요. 유니티 VR에서 한 쪽눈만 렌더링되는 경우 #싱글 패스 인스턴스화 렌더링(Single Pass Instanced)VR을 개발하다 보면 한 쪽 눈에만 오브젝트 혹은 UI가 렌더링되는 경우가 종종 발생하시죠?이러한 문제들을 해결하기 위해서는 싱글 패스 인스턴스(Single Pass Instanced)라는 개념을 아셔야 합니다. wlsdn629.tistory.com 유니티 Multi Pass와 Single Pass Instanced/Multi View에 대해VR작업을 ..
유니티 메테리얼 복사본 없이 수정하기 #MaterialPropertyBlock메티리얼을 직접 수정하면 각 객체에 대해 메모리에 해당 머티리얼의 새로운 인스턴스를 생성하게 됩니다. MaterialPropertyBlock를 사용하여 복사본이 생성되는 문제를 해결할 수 있습니다. MaterialProwlsdn629.tistory.com 유니티 OVR 메테리얼 수정을 돕는 MaterialPropertyBlockEditorOVR SDK 프로젝트를 스터디 하다보면 MaterialPropertyBlockEditor 스크립트를 종종 발견하곤 했습니다. MaterialPropertyBlockEditor 스크립트가 무엇인지 이번 포스팅에서 살펴보고자 합니다😁. MaterialPropertyBlocwlsdn629.tis..
SRP Batcher가 “같은 셰이더 Variant(= Keyword 집합)” 만 묶어 준다는 사실은 많이 알려져 있지만, 무엇이 Variant를 갈라놓고 어디까지 다른 값을 허용하는지는 문서 곳곳에 흩어져 있습니다. 아래 표에 허용 범위 / 배제 범위를 정리하였 세 가지 배칭 기법의 세부 비교에 대해 알아보겠습니다!요약(복습)Shader Variant 분리 조건은 Pass, Shader Keywords, CBUFFER 레이아웃 3가지입니다. Texture·Color 값이 달라도 상관없지만 Keyword 플래그가 하나라도 다르면 SRP Batcher가 끊기게 됩니다.Static Batching 은 머티리얼만 공유하면 메시를 통째로 합쳐 1 드로우가 가능하지만, RAM·VRAM이 상당히 늘어나게 됩니다.G..
InverseTransformPoint 예시 설명Vector3 localTipPos = referential.InverseTransformPoint(tip.position);월드 좌표계에 있는 tip.position을 referential 기준의 로컬 좌표로 변환합니다.해석tip.position: 팁의 월드 좌표계 위치referential: 기준이 되는 오브젝트 (예: 접촉 대상의 Transform)localTipPos: referential 기준에서 본 팁의 상대적 위치즉, localTipPos는 "이 팁이 표면 오브젝트 기준으로 어느 위치에 있는지"를 알려줍니다.📌 이걸 통해 표면 안으로 얼마나 들어갔는지, 어느 방향으로 들어왔는지를 정밀하게 계산할 수 있습니다.BlockingSurface 구성은 ..
개요Unity 프로젝트에서 한글 주석을 작성하다 보면, 가끔 Rider 편집기 상단에“The file was loaded in a wrong encoding: ‘UTF-8’”라는 빨간 에러 바가 뜨며 Ä¥ÆÇ¿¡… 같은 깨진 글자가 보일 때가 있습니다.이 글에서는 Rider에서 파일 인코딩을 바로 잡고, 한글 주석을 정상적으로 표시하는 방법을 단계별로 정리합니다.원인파일이 실제로는 CP949(윈도우 한글) · EUC-KR 등으로 저장되어 있는데, Rider가 UTF-8으로 불러오면서 바이트를 잘못 해석해 깨진 글자가 나옵니다.해결 방법1. “Reload in another encoding” 클릭에디터 상단 빨간 바 우측의 Reload in another encoding 버튼을 클릭팝업에서 Korean (..
해당 컴포넌트는 많은 곳에서 응용할 수 있습니다.이번 포스팅에서는 Snap Interactor에서 사용하는 방법에 대해 알아보겠습니다. 유니티 Snap Interactor을 이용해서 원하는 위치에 오브젝트 놓기 #SocketSnap Interactor 컴포넌트와 Snap Interactable을 활용하면 원하는 위치에 원하는 오브젝트를 놓을 수 있습니다. 이때 어느정도 간격이 떨어져 있어도 Smooth하게 해당 위치로 날아가면서 딱 Snap되듯 위치wlsdn629.tistory.comTagSet 컴포넌트란?Meta SDK에서 TagSet 컴포넌트는 "(문자열)Tag"를 이용해 인터랙터(Interactor)와 인터랙터블(Interactable) 간의 상호작용 대상을 손쉽게 필터링할 수 있도록 돕습니다. ..
PlayerRef와 NetworkObjectPlayerRef는 세션에 참여 중인 각 플레이어를 식별하는 핸들러이며, NetworkObject는 네트워크를 통해 동기화되는 게임 오브젝트를 의미합니다."Player Object(플레이어 오브젝트)"란 각 플레이어가 자신의 아바타로 사용할 NetworkObject를 고정해 두는 편의 기능으로, 설정된 매핑은 자동으로 모든 클라이언트에 복제됩니다.NetworkRunner.SetPlayerObject SetPlayerObject(PlayerRef player, NetworkObject networkObject)는 지정된 플레이어와 네트워크 오브젝트를 연관 짓습니다.이 호출은 네트워크 이벤트로 전파되어, 다른 클라이언트에서도 TryGetPlayerObject를 통해..
LINQ란? (링크란?)LINQ는 Language Integrated Query의 줄임말로, C# 언어 안에서 SQL처럼 데이터를 다루는 문법입니다.리스트나 배열, 딕셔너리, 데이터베이스까지 다양한 컬렉션을 대상으로 사용할 수 있습니다. Where, Select, GroupBy, Any 등에 대해 간단히 설명드리겠습니다.Where – 조건에 맞는 데이터만 필터링💬 역할: LINQ에서의 Where는 모든 요소를 돌면서 조건을 만족하는 것만 추출합니다. 즉, “이런 애들만 골라줘!” 명령하는 것이지요.var activeObjs = FindObjectsOfType() .Where(obj => obj.activeSelf); Where는 루프와 if를 합친 느낌입니다obj.activeSelf == true..
시간복잡도란?시간복잡도(Time Complexity)는 입력 데이터의 크기(n)에 따라 알고리즘이 수행하는 연산량을 나타낸 것입니다.간단히 말해 "입력이 많아질수록 이 코드가 얼마나 느려질까?"를 수학적으로 표현하는 방법입니다.Big O Notation (빅오 표기법)이란?Big O 표기법은 알고리즘의 최악의 실행 시간을 나타내며, 다음과 같은 종류가 있습니다. 표기 설명 예시 O(1)상수 시간 – 입력 크기에 관계 없음배열에서 인덱스로 접근O(log n)로그 시간 – 이진 탐색처럼 반씩 줄이는 구조이진 탐색O(n)선형 시간 – 입력이 커지면 비례해서 늘어남전체 탐색O(n log n)대부분의 정렬 알고리즘 성능병합정렬, 퀵정렬O(n²)이중 반복문 등버블정렬, 삽입정렬O(2ⁿ), O(n!)매우 느림 –..
Nav Mesh를 구울 때 제외당하고 싶은 객체에 NavMesh Modifier컴포넌트를 추가해준 후, Mode에서 Remove Object를 선택해줍니다. 보너스Nav Mesh를 구울 때 굽고 싶은 객체만 지정해주는 방법은, NavMesh Modifier의 Mode를 Add or Modify Object로 설정한 후,Nav Mesh Surface컴포넌트의 Object Collection - Collect Objects를 NavMeshModifier Component Only로 바꿔주면 됩니다. 그 외 All, Volume, Current가 있는데 플젝에 맞게 선택하시면 됩니다.
프로그래밍과 그래픽스 분야에서는 데이터를 명확하고 직관적으로 표현하기 위해 종종 정규화(Normalization)를 사용합니다.그 중에서도 특히 자주 활용되는 방법 중 하나가 역정규화 패턴(Normalized Inverse Pattern)입니다. 이번 글에서는 이 역정규화 패턴의 원리를 이해하고, 실제 프로그래밍에서 어떤 방식으로 활용되는지 예시와 함께 살펴보겠습니다.역정규화 패턴이란 무엇인가? 이 수식에서 1를 빼는 이유는 항상 0에서 1 사이의 값으로 표현하고자 하기 때문입니다. 거리 기반의 사운드 크기 표현을 역정규화로 예시 들면 다음과 같습니다. 현재 거리(distance) 최대 거리(max) 볼륨 값 0 (표면에 닿음)100.05 (중간까지 눌림)100.510 (최대 눌림)101.0
멀티플레이어 네트워크 동기화에서 동작 처리와 시각 처리의 분리는 필수입니다.Fusion2는 이 목적을 위해 두 개의 핵심 메서드 FixedUpdateNetwork()와 Render()를 제공합니다. 항목 FixedUpdateNetwork() Render() 기준 시간 단위✅ Fusion Tick (고정 간격)✅ Fusion Tick (고정 간격)역할✅ 상태 계산 및 동기화 (위치, 입력 등)✅ 클라이언트 시각화 전용 (보간, 애니메이션 등)서버와 클라이언트 공유 여부✅ 서버/클라이언트 공통 동작❌ 클라이언트 전용 처리동작 주기✅ 고정 주기 실행 (Tick 단위)✅ 매 프레임 실행 (Unity Update()와 유사)보간 사용 여부❌ 계산 대상 (원본 데이터)✅ 보간된 결과 반영수정 가능 데이터✅ N..
Unity 개발 중에 에디터에서만 실행되도록 코드를 작성해야 하는 경우가 종종 있습니다.대표적으로 디버깅, 에디터 전용 API 호출이 그러한 예인데요. 이때 사용할 수 있는 두 가지 방법이 있습니다.바로 [Conditional("UNITY_EDITOR")] 특성과 전처리기 지시문 #if UNITY_EDITOR … #endif 입니다.이번 글에서는 두 방법의 동작 방식을 비교해보고, 어떤 상황에서 어떤 방식을 선택하는 것이 좋은지 알아보겠습니다. [Conditional("UNITY_EDITOR")] 특성[Conditional("UNITY_EDITOR")]는 System.Diagnostics 네임스페이스에 정의된 특성입니다.이 특성이 적용된 메서드의 호출은 컴파일 시점에 조건 심볼(여기서는 UNITY_EDI..