#nullable enable using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; using UVC.Data; using UVC.Object3d; using UVC.UI.Info; namespace UVC.Factory.Component { /// /// /// public abstract class FactoryObject : InteractiveObject { protected FactoryObjectInfo? info; public FactoryObjectInfo? Info { get => info; set { info = value; if (value != null) { // 객체의 이름을 GameObject의 이름으로 설정합니다. gameObject.name = value.Name; FactoryObjectManager.Instance.RegisterFactoryObject(this); } } } protected DataObject? data; protected List? dataOrderedMask; /// /// InfoWindow에 표시할 데이터의 순서와 항목을 지정하는 마스크입니다. /// public List? DataOrderedMask { get => dataOrderedMask; set { dataOrderedMask = value; } } private void OnDestroy() { FactoryObjectManager.Instance.UnregisterFactoryObject(Info!); } /// /// 포인터 클릭 이벤트를 처리하고 관련 데이터가 포함된 정보 창을 표시합니다. /// /// 이 메서드는 정보 창이 현재 표시되어 있는지, 그리고 /// 유효한 데이터가 있는지 확인합니다. 데이터가 마스크를 사용하여 정렬된 경우 마스크된 데이터만 표시되고, 그렇지 않은 경우 /// 사용 가능한 모든 데이터가 표시됩니다. 정보 창은 현재 /// 변환을 기준으로 배치됩니다. /// 포인터 클릭과 관련된 이벤트 데이터입니다. public override void OnPointerClick(PointerEventData eventData) { Debug.Log($"OnPointerClick2: {gameObject.name}"); if (data != null && data.Count > 0) { Dictionary info = new Dictionary(); // dataOrderedMask가 설정되어 있으면 해당 순서대로 정보를 가져옵니다. if (dataOrderedMask != null && dataOrderedMask.Count > 0) { foreach (var key in dataOrderedMask) { if (data.ContainsKey(key)) { info[key] = data[key]; } } } else { // dataOrderedMask가 설정되어 있지 않으면 모든 데이터를 사용합니다. info = new Dictionary(data); } Debug.Log($"OnPointerClick: {gameObject.name} - {info.Count} items"); InfoWindow.Instance.Show(transform, info); } } /// /// 변경된 데이터만 업데이트합니다. /// /// public void UpdateData(IDataObject? newData) { if(newData == null) return; DataObject? dataObject = newData as DataObject; if (dataObject == null || dataObject.Count == 0) return; ProcessData(dataObject); } /// /// 지정된 데이터 객체를 처리합니다. 이 메서드는 파생 클래스에서 재정의되어 /// 사용자 지정 데이터 처리 로직을 구현하도록 설계되었습니다. /// /// 파생 클래스는 매개변수에 대한 특정 처리 동작을 제공하기 위해 /// 이 메서드를 재정의해야 합니다. /// 사용하기 전에 매개변수의 유효성을 검사해야 합니다. /// 처리할 데이터 객체입니다. null일 수 없습니다. protected virtual void ProcessData(DataObject newData) {} public Vector3 GetPosition(bool world = false) { if (!world) return transform.position; return transform.TransformPoint(transform.position); } public Vector3 GetEntrancePosition(bool world = false) { if (!world) return transform.position; return transform.TransformPoint(transform.position); } } }