Files
SHI_Sample_UI/Assets/Scripts/DTNavigation/Camera/CameraNavManager.cs
2026-03-09 01:05:56 +09:00

92 lines
3.8 KiB
C#

#nullable enable
using System.Collections.Generic;
using DTNavigation.Model;
using UnityEngine;
namespace DTNavigation.CameraSystem
{
/// <summary>
/// 탭 선택 이벤트를 수신하여 CameraNavPoint를 통해 카메라를 이동시킵니다.
///
/// ■ NavPoint 자동 등록 규칙
/// 이 컴포넌트가 붙은 GameObject의 자식 오브젝트에
/// CameraNavPoint 컴포넌트를 추가하면 Awake 시 자동으로 인식됩니다.
///
/// [CameraNavManager GameObject]
/// ├── NavPoint_24Bay (CameraNavPoint, ItemId = "cutting-24bay")
/// ├── NavPoint_25Bay (CameraNavPoint, ItemId = "cutting-25bay")
/// └── ...
///
/// ■ Inspector 설정
/// - CameraController : 카메라 오브젝트에 붙은 CameraController를 연결합니다.
/// </summary>
public sealed class CameraNavManager : MonoBehaviour
{
[SerializeField] private CameraController? _cameraController;
private readonly Dictionary<string, CameraNavPoint> _navPointMap = new();
private NavSelectionModel? _selectionModel;
// ──────────────────────────────────────────────────────────
private void Awake()
{
if(_cameraController == null)
_cameraController = FindAnyObjectByType<CameraController>();
// 자식 계층에서 CameraNavPoint를 모두 수집하여 itemId로 매핑
var points = GetComponentsInChildren<CameraNavPoint>();
for (var i = 0; i < points.Length; i++)
{
var point = points[i];
if (string.IsNullOrEmpty(point.ItemId))
{
Debug.LogWarning(
$"[CameraNavManager] '{point.gameObject.name}'의 ItemId가 비어 있습니다. 건너뜁니다.",
point.gameObject);
continue;
}
if (_navPointMap.ContainsKey(point.ItemId))
{
Debug.LogWarning(
$"[CameraNavManager] ItemId '{point.ItemId}'가 중복 등록되었습니다. 먼저 등록된 항목을 사용합니다.",
point.gameObject);
continue;
}
_navPointMap[point.ItemId] = point;
}
Debug.Log($"[CameraNavManager] NavPoint {_navPointMap.Count}개 자동 등록 완료.");
}
private void OnDestroy()
{
if (_selectionModel != null)
_selectionModel.OnSelectionChanged -= HandleSelectionChanged;
}
// ──────────────────────────────────────────────────────────
/// <summary>
/// SidebarNavigationController에서 호출하여 NavSelectionModel을 연결합니다.
/// 이후 탭이 선택될 때마다 자동으로 카메라가 이동합니다.
/// </summary>
public void Initialize(NavSelectionModel selectionModel)
{
_selectionModel = selectionModel;
_selectionModel.OnSelectionChanged += HandleSelectionChanged;
}
// ──────────────────────────────────────────────────────────
private void HandleSelectionChanged(string? itemId)
{
if (itemId == null) return;
if (_cameraController == null) return;
if (_navPointMap.TryGetValue(itemId, out var point))
point.ApplyTo(_cameraController);
}
}
}