Files
XRLib/Assets/Scripts/UVC/Object3d/FactoryObject.cs
2025-06-19 23:58:09 +09:00

120 lines
4.2 KiB
C#

#nullable enable
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UVC.Extention;
using UVC.UI.Info;
namespace UVC.Object3d
{
/// <summary>
///
/// </summary>
public class FactoryObject : InteractiveObject
{
// InfoWindow 인스턴스에 대한 참조
protected InfoWindow infoWindow;
protected Camera mainCamera;
protected FactoryObjectInfo? factoryObjectInfo;
public FactoryObjectInfo? FactoryObjectInfo
{
get => factoryObjectInfo;
set
{
factoryObjectInfo = value;
if (value != null)
{
// 객체의 이름을 GameObject의 이름으로 설정합니다.
gameObject.name = value.Name;
}
}
}
protected Dictionary<string, object> data = new Dictionary<string, object>();
protected List<string>? dataOrderedMask;
/// <summary>
/// InfoWindow에 표시할 데이터의 순서와 항목을 지정하는 마스크입니다.
/// </summary>
public List<string>? DataOrderedMask
{
get => dataOrderedMask;
set
{
dataOrderedMask = value;
}
}
private void Awake()
{
mainCamera = Camera.main;
// 씬에 있는 InfoWindow 인스턴스를 동적으로 찾습니다.
// FindObjectOfType은 씬에서 해당 타입의 활성화된 첫 번째 객체를 반환합니다.
infoWindow = InfoWindow.Create();
if (infoWindow == null)
{
Debug.LogError("씬에서 InfoWindow 컴포넌트를 찾을 수 없습니다. InfoWindow가 씬에 존재하고 활성화되어 있는지 확인해주세요.");
enabled = false; // infoWindow가 없으면 이 스크립트를 비활성화합니다.
}
}
/// <summary>
/// 포인터 클릭 이벤트를 처리하고 관련 데이터가 포함된 정보 창을 표시합니다.
/// </summary>
/// <remarks>이 메서드는 정보 창이 현재 표시되어 있는지, 그리고
/// 유효한 데이터가 있는지 확인합니다. 데이터가 마스크를 사용하여 정렬된 경우 마스크된 데이터만 표시되고, 그렇지 않은 경우
/// 사용 가능한 모든 데이터가 표시됩니다. 정보 창은 현재
/// 변환을 기준으로 배치됩니다.</remarks>
/// <param name="eventData">포인터 클릭과 관련된 이벤트 데이터입니다.</param>
public override void OnPointerClick(PointerEventData eventData)
{
if(!infoWindow.IsVisible && data != null && data.Count > 0)
{
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);
}
infoWindow.Show(transform, info);
}
}
/// <summary>
/// 변경된 데이터만 업데이트합니다.
/// </summary>
/// <param name="data"></param>
public void UpdateData(IDictionary<string, object> data)
{
foreach (var kvp in data)
{
if (this.data.ContainsKey(kvp.Key))
{
this.data[kvp.Key] = kvp.Value;
}
else
{
this.data.Add(kvp.Key, kvp.Value);
}
}
}
}
}