Files
XRLib/Assets/Scripts/UVC/Factory/Component/FactoryObject.cs

124 lines
4.5 KiB
C#
Raw Normal View History

2025-06-19 23:58:09 +09:00
#nullable enable
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
2025-06-20 17:37:20 +09:00
using UVC.Data;
using UVC.Object3d;
2025-06-19 23:58:09 +09:00
using UVC.UI.Info;
2025-06-23 20:06:15 +09:00
namespace UVC.Factory.Component
2025-06-19 23:58:09 +09:00
{
/// <summary>
///
/// </summary>
2025-06-23 20:06:15 +09:00
public abstract class FactoryObject : InteractiveObject
2025-06-19 23:58:09 +09:00
{
2025-06-20 17:37:20 +09:00
protected FactoryObjectInfo? info;
public FactoryObjectInfo? Info
2025-06-19 23:58:09 +09:00
{
2025-06-20 17:37:20 +09:00
get => info;
2025-06-19 23:58:09 +09:00
set
{
2025-06-20 17:37:20 +09:00
info = value;
2025-06-19 23:58:09 +09:00
if (value != null)
{
2025-06-20 17:37:20 +09:00
// 객체의 이름을 GameObject의 이름으로 설정합니다.
2025-06-19 23:58:09 +09:00
gameObject.name = value.Name;
2025-06-20 17:37:20 +09:00
FactoryObjectManager.Instance.RegisterFactoryObject(this);
2025-06-19 23:58:09 +09:00
}
}
}
2025-06-20 17:37:20 +09:00
protected DataObject? data;
2025-06-19 23:58:09 +09:00
protected List<string>? dataOrderedMask;
2025-06-20 17:37:20 +09:00
/// <summary>
/// InfoWindow에 표시할 데이터의 순서와 항목을 지정하는 마스크입니다.
/// </summary>
2025-06-19 23:58:09 +09:00
public List<string>? DataOrderedMask
{
get => dataOrderedMask;
set
{
dataOrderedMask = value;
}
}
2025-06-20 17:37:20 +09:00
private void OnDestroy()
{
FactoryObjectManager.Instance.UnregisterFactoryObject(Info!);
2025-06-19 23:58:09 +09:00
}
/// <summary>
/// 포인터 클릭 이벤트를 처리하고 관련 데이터가 포함된 정보 창을 표시합니다.
/// </summary>
/// <remarks>이 메서드는 정보 창이 현재 표시되어 있는지, 그리고
/// 유효한 데이터가 있는지 확인합니다. 데이터가 마스크를 사용하여 정렬된 경우 마스크된 데이터만 표시되고, 그렇지 않은 경우
/// 사용 가능한 모든 데이터가 표시됩니다. 정보 창은 현재
/// 변환을 기준으로 배치됩니다.</remarks>
/// <param name="eventData">포인터 클릭과 관련된 이벤트 데이터입니다.</param>
2025-06-20 17:37:20 +09:00
public override void OnPointerClick(PointerEventData eventData)
2025-06-19 23:58:09 +09:00
{
2025-06-20 17:37:20 +09:00
if (data != null && data.Count > 0)
2025-06-19 23:58:09 +09:00
{
Dictionary<string, object> info = new Dictionary<string, object>();
// 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<string, object>(data);
}
2025-06-20 17:37:20 +09:00
InfoWindow.Instance.Show(transform, info);
2025-06-19 23:58:09 +09:00
}
}
/// <summary>
/// 변경된 데이터만 업데이트합니다.
/// </summary>
2025-06-20 17:37:20 +09:00
/// <param name="newData"></param>
public void UpdateData(IDataObject? newData)
2025-06-19 23:58:09 +09:00
{
2025-06-20 17:37:20 +09:00
if(newData == null) return;
DataObject? dataObject = newData as DataObject;
if (dataObject == null || dataObject.Count == 0) return;
ProcessData(dataObject);
2025-06-19 23:58:09 +09:00
}
2025-06-20 17:37:20 +09:00
/// <summary>
/// 지정된 데이터 객체를 처리합니다. 이 메서드는 파생 클래스에서 재정의되어
/// 사용자 지정 데이터 처리 로직을 구현하도록 설계되었습니다.
/// </summary>
/// <remarks>파생 클래스는 <paramref name="newData"/> 매개변수에 대한 특정 처리 동작을 제공하기 위해
/// 이 메서드를 재정의해야 합니다.
/// 사용하기 전에 매개변수의 유효성을 검사해야 합니다.</remarks>
/// <param name="newData">처리할 데이터 객체입니다. null일 수 없습니다.</param>
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);
}
2025-06-19 23:58:09 +09:00
}
}