using UnityEngine; // 유니티 엔진의 기본 기능을 불러올거에요 -> UnityEngine을 namespace GameSystems.Optimization // 최적화 네임스페이스를 정의할거에요 -> GameSystems.Optimization으로 { /// /// PlayerRangeManager의 설정을 관리하는 ScriptableObject /// [CreateAssetMenu(fileName = "RenderOptimizationConfig", menuName = "Game Systems/Render Optimization Config")] // 에셋 생성 메뉴를 만들거에요 -> 지정된 경로에 public sealed class RenderOptimizationConfig : ScriptableObject // 클래스를 선언할거에요 -> ScriptableObject를 상속받는 RenderOptimizationConfig를 { #region Inspector Fields [Header("=== 렌더링 범위 설정 ===")] // 인스펙터에 제목을 표시할거에요 -> === 렌더링 범위 설정 === 을 [Tooltip("플레이어 주변 렌더링 반지름 (유니티 단위)")] // 툴팁을 추가할거에요 -> 설명 문구를 [SerializeField, Range(10f, 200f)] // 슬라이더 범위를 지정할거에요 -> 10에서 200 사이로 private float _renderRange = 40f; // 변수를 선언할거에요 -> 기본 렌더링 범위인 40을 _renderRange에 [Tooltip("페이드 아웃 시작 거리 비율 (0.8 = 렌더 범위의 80%부터 페이드 시작)")] // 툴팁을 추가할거에요 -> 비율 설명을 [SerializeField, Range(0.5f, 1f)] // 슬라이더 범위를 지정할거에요 -> 0.5에서 1 사이로 private float _fadeStartRatio = 0.8f; // 변수를 선언할거에요 -> 페이드 시작 비율인 0.8을 _fadeStartRatio에 [Header("=== 업데이트 주기 ===")] // 제목을 표시할거에요 -> === 업데이트 주기 === 를 [Tooltip("오브젝트 컬링 검사 주기 (초 단위)")] // 툴팁을 추가할거에요 -> 검사 주기 설명을 [SerializeField, Range(0.05f, 1f)] // 슬라이더 범위를 지정할거에요 -> 0.05에서 1 사이로 private float _checkInterval = 0.2f; // 변수를 선언할거에요 -> 검사 간격인 0.2를 _checkInterval에 [Header("=== 플레이어 설정 ===")] // 제목을 표시할거에요 -> === 플레이어 설정 === 을 [Tooltip("플레이어를 찾을 태그 이름")] // 툴팁을 추가할거에요 -> 태그 이름 설명을 [SerializeField] // 필드를 직렬화할거에요 -> 인스펙터에 보이게 private string _playerTag = "Player"; // 변수를 선언할거에요 -> 플레이어 태그인 "Player"를 _playerTag에 [Header("=== 성능 설정 ===")] // 제목을 표시할거에요 -> === 성능 설정 === 을 [Tooltip("한 프레임에 처리할 최대 오브젝트 수 (0 = 무제한)")] // 툴팁을 추가할거에요 -> 처리량 설명을 [SerializeField, Min(0)] // 최소값을 지정할거에요 -> 0으로 private int _maxObjectsPerFrame = 50; // 변수를 선언할거에요 -> 프레임당 최대 개수인 50을 _maxObjectsPerFrame에 [Header("=== 디버그 설정 ===")] // 제목을 표시할거에요 -> === 디버그 설정 === 을 [SerializeField] private bool _showGizmos = true; // 변수를 선언할거에요 -> 기즈모 표시 여부를 _showGizmos에 [SerializeField] private bool _enableVerboseLogging = false; // 변수를 선언할거에요 -> 상세 로그 여부를 _enableVerboseLogging에 #endregion #region Public Properties public float RenderRange => _renderRange; // 값을 반환할거에요 -> 렌더링 범위 수치를 public float CheckInterval => _checkInterval; // 값을 반환할거에요 -> 검사 주기 수치를 public string PlayerTag => _playerTag; // 값을 반환할거에요 -> 플레이어 태그 문자열을 public int MaxObjectsPerFrame => _maxObjectsPerFrame; // 값을 반환할거에요 -> 최대 처리 개수를 public bool ShowGizmos => _showGizmos; // 값을 반환할거에요 -> 기즈모 활성화 여부를 public bool EnableVerboseLogging => _enableVerboseLogging; // 값을 반환할거에요 -> 로그 활성화 여부를 /// /// 페이드 시작 거리 계산 /// public float FadeStartDistance => _renderRange * _fadeStartRatio; // 값을 계산해서 반환할거에요 -> 렌더링 범위에 비율을 곱한 결과를 #endregion #region Validation private void OnValidate() // 값이 변경될 때 실행할거에요 -> OnValidate 함수를 { // 유효성 검사 if (_renderRange < 10f) // 조건이 맞으면 실행할거에요 -> 렌더링 범위가 10보다 작다면 { Debug.LogWarning("[RenderOptimizationConfig] Render Range가 너무 작습니다. 최소 10으로 설정됩니다."); // 경고를 출력할거에요 -> 범위 오류 메시지를 _renderRange = 10f; // 값을 설정할거에요 -> 10으로 } if (string.IsNullOrWhiteSpace(_playerTag)) // 조건이 맞으면 실행할거에요 -> 플레이어 태그가 비어있다면 { Debug.LogWarning("[RenderOptimizationConfig] Player Tag가 비어있습니다. 'Player'로 설정됩니다."); // 경고를 출력할거에요 -> 태그 오류 메시지를 _playerTag = "Player"; // 값을 설정할거에요 -> "Player"로 } if (_checkInterval < 0.05f) // 조건이 맞으면 실행할거에요 -> 검사 간격이 0.05보다 작다면 { Debug.LogWarning("[RenderOptimizationConfig] Check Interval이 너무 짧습니다. 성능에 영향을 줄 수 있습니다."); // 경고를 출력할거에요 -> 성능 영향 메시지를 } } #endregion #region Factory Methods /// /// 기본 설정 생성 /// public static RenderOptimizationConfig CreateDefault() // 함수를 선언할거에요 -> 기본 설정을 생성하는 CreateDefault를 { RenderOptimizationConfig config = CreateInstance(); // 인스턴스를 생성할거에요 -> RenderOptimizationConfig 객체를 config._renderRange = 40f; // 값을 설정할거에요 -> 40으로 config._checkInterval = 0.2f; // 값을 설정할거에요 -> 0.2로 config._playerTag = "Player"; // 값을 설정할거에요 -> "Player"로 config._showGizmos = true; // 값을 설정할거에요 -> 참(true)으로 return config; // 반환할거에요 -> 생성된 설정 객체를 } #endregion } }