Unity 카메라 컬링과 렌더링 최적화
Frustum Culling
섹션 제목: “Frustum Culling”카메라 시야 밖의 오브젝트를 자동으로 렌더링에서 제외합니다. Unity가 기본으로 수행하며, 오브젝트의 Bounds가 View Frustum과 교차하는지 검사합니다.
최적화 포인트: Bounds가 너무 크면 시야 밖에 있어도 렌더링됩니다.
// 커스텀 Bounds로 컬링 범위 조정var renderer = GetComponent<MeshRenderer>();renderer.bounds = new Bounds(transform.position, new Vector3(2, 2, 2));
// 수동 Frustum Culling 검사Plane[] planes = GeometryUtility.CalculateFrustumPlanes(Camera.main);if (GeometryUtility.TestPlanesAABB(planes, renderer.bounds)) Debug.Log("시야 내");Occlusion Culling
섹션 제목: “Occlusion Culling”다른 오브젝트에 가려진 오브젝트를 컬링합니다.
설정:
- 오브젝트에
Static → Occluder Static/Occludee Static체크 - Window → Rendering → Occlusion Culling → Bake
// 카메라의 Occlusion Culling 활성화Camera.main.useOcclusionCulling = true;
// 런타임 결과 시각화 (에디터 전용)// Scene뷰 → Occlusion 오버레이대형 실내 맵(복도, 방 구조)에서 특히 효과적입니다.
Layer Culling Mask
섹션 제목: “Layer Culling Mask”레이어별로 카메라에서 렌더링 여부를 제어합니다.
// 특정 레이어만 렌더링Camera.main.cullingMask = LayerMask.GetMask("Default", "Player");
// 특정 레이어 제외int mask = Camera.main.cullingMask;mask &= ~LayerMask.GetMask("UI", "Debug");Camera.main.cullingMask = mask;UI 카메라 분리 패턴:
// 메인 카메라: UI 레이어 제외mainCamera.cullingMask &= ~LayerMask.GetMask("UI");
// UI 전용 카메라: UI 레이어만uiCamera.cullingMask = LayerMask.GetMask("UI");uiCamera.clearFlags = CameraClearFlags.Depth; // 배경 투명Layer별 Culling Distance
섹션 제목: “Layer별 Culling Distance”레이어별로 다른 컬링 거리를 지정합니다.
void SetLayerCullDistances() { float[] distances = new float[32]; // 기본값: 0 = 메인 카메라 Far Clip Plane 사용
distances[LayerMask.NameToLayer("Foliage")] = 80f; // 풀, 나무 잎 distances[LayerMask.NameToLayer("Debris")] = 40f; // 파편 distances[LayerMask.NameToLayer("Decals")] = 30f; // 데칼
Camera.main.layerCullDistances = distances; Camera.main.layerCullSpherical = true; // 구형 컬링 (사각형보다 자연스러움)}카메라 LOD Bias
섹션 제목: “카메라 LOD Bias”LOD 전환 거리를 전역으로 조정합니다.
// 높을수록 높은 LOD를 더 멀리서 사용QualitySettings.lodBias = 2.0f; // 기본값 1.0
// 카메라별 설정Camera.main.fieldOfView = 60f; // FOV가 넓을수록 LOD 전환 빨라짐OnBecameVisible / OnBecameInvisible
섹션 제목: “OnBecameVisible / OnBecameInvisible”오브젝트의 가시성 변화를 감지합니다.
// 화면에 보일 때만 AI 업데이트 실행public class AIController : MonoBehaviour { bool _visible = false;
void OnBecameVisible() { _visible = true; } void OnBecameInvisible() { _visible = false; }
void Update() { if (!_visible) return; UpdateAI(); // 보일 때만 실행 }}- Frustum Culling은 자동, Occlusion Culling은 별도 베이크 필요
layerCullDistances로 원거리 소품류 레이어는 짧은 컬링 거리 설정- UI는 전용 카메라로 분리해
cullingMask관리 OnBecameVisible/Invisible로 보이는 오브젝트만 업데이트lodBias로 전체 LOD 거리를 플랫폼별로 조정