Files
Studio/Assets/Scripts/Studio/UI/Panel/Panel_DynamicObjectInfo.cs
2025-05-27 19:33:19 +09:00

509 lines
21 KiB
C#

using System.Collections.Generic;
using TMPro;
using UnityEngine;
using XRLib.UI;
using Studio.Manage;
using System.Linq;
using Studio.Core;
using Studio.Command;
using UnityEngine.UI;
using System;
using Studio.AssetTool;
using UnityEngine.Rendering.Universal;
using Studio.Conifg;
namespace Studio.UI
{
public class Panel_DynamicObjectInfo : PanelBase
{
public enum InputFieldType
{
none,
posX, posY, posZ,
rotX, rotY, rotZ,
scaX, scaY, scaZ,
}
public class SelectedInput
{
public InputFieldType type = InputFieldType.none;
public float value = 0.0f;
public SelectedInput(InputFieldType type, float value)
{
this.type = type;
this.value = value;
}
}
private TextMeshProUGUI Text_Name;
private TMP_InputField InputField_PositionX;
private TMP_InputField InputField_PositionY;
private TMP_InputField InputField_PositionZ;
private TMP_InputField InputField_RotationX;
private TMP_InputField InputField_RotationY;
private TMP_InputField InputField_RotationZ;
private TMP_InputField InputField_ScaleX;
private TMP_InputField InputField_ScaleY;
private TMP_InputField InputField_ScaleZ;
private TMP_InputField InputField_Name;
private TMP_InputField InputField_ID;
private AddComponetModal addComponetModal;
private ConnectionModal connectionModal;
public event System.Action<List<GameObject>> onTransformChanged;
private List<GameObject> selectedObjects = new List<GameObject>();
private SelectedInput lastSelectedInputField = new SelectedInput(InputFieldType.none, 0.0f);
public Action onConnectedData;
public Action<string> onRetouchData;
public Action<string> onDeleteData;
public Action onConnectedAlarm;
public Action<string> onRetouchAlarm;
public Action<string> onDeleteAlarm;
private CustomAssetRenderObject singleSelectObject;
private AddComponetDataScriptable componetScriptable;
private string componetKey;
private string topic;
private string code;
private bool isAuto;
public override void AfterAwake()
{
InputField_PositionX.onValueChanged.AddListener(OnPosXChanged);
InputField_PositionY.onValueChanged.AddListener(OnPosYChanged);
InputField_PositionZ.onValueChanged.AddListener(OnPosZChanged);
InputField_RotationX.onValueChanged.AddListener(OnRotXChanged);
InputField_RotationY.onValueChanged.AddListener(OnRotYChanged);
InputField_RotationZ.onValueChanged.AddListener(OnRotZChanged);
InputField_ScaleX.onValueChanged.AddListener(OnScaXChanged);
InputField_ScaleY.onValueChanged.AddListener(OnScaYChanged);
InputField_ScaleZ.onValueChanged.AddListener(OnScaZChanged);
InputField_PositionX.onDeselect.AddListener(OnDeselectInputField);
InputField_PositionY.onDeselect.AddListener(OnDeselectInputField);
InputField_PositionZ.onDeselect.AddListener(OnDeselectInputField);
InputField_RotationX.onDeselect.AddListener(OnDeselectInputField);
InputField_RotationY.onDeselect.AddListener(OnDeselectInputField);
InputField_RotationZ.onDeselect.AddListener(OnDeselectInputField);
InputField_ScaleX.onDeselect.AddListener(OnDeselectInputField);
InputField_ScaleY.onDeselect.AddListener(OnDeselectInputField);
InputField_ScaleZ.onDeselect.AddListener(OnDeselectInputField);
InputField_ID.onValueChanged.AddListener(OnChangedID);
addComponetModal = GetComponentInChildren<AddComponetModal>();
connectionModal = GetComponentInChildren<ConnectionModal>();
addComponetModal.Init();
connectionModal.Init();
connectionModal.gameObject.SetActive(false);
addComponetModal.onSelectComponet = ChangeCompoentItem;
connectionModal.onTopicItem = ChangeTopicItem;
connectionModal.onIsAuto = ChangeToggleItem;
componetScriptable = Resources.Load<AddComponetDataScriptable>("Scriptable/AddComponetData");
componetScriptable.SetItem();
ResetObjectInfo();
//Text_DataName.SetText("없음");
//Button_ConnectData.onClick.AddListener(OnClickConnectDataButton);
//Button_RetouchData.onClick.AddListener(OnClickRetouchDataButton);
//Button_DeleteData.onClick.AddListener(OnClickDeleteDataButton);
//Text_AlarmName.SetText("없음");
//Button_ConnectAlarm.onClick.AddListener(OnClickConnectAlarmButton);
//Button_RetouchAlarm.onClick.AddListener(OnClickRetouchAlarmButton);
//Button_DeleteAlarm.onClick.AddListener(OnClickDeleteAlarmButton);
}
void OnPosXChanged(string input)
{
OnTransformChanged(InputFieldType.posX, input);
}
void OnPosYChanged(string input)
{
OnTransformChanged(InputFieldType.posY, input);
}
void OnPosZChanged(string input)
{
OnTransformChanged(InputFieldType.posZ, input);
}
void OnRotXChanged(string input)
{
OnTransformChanged(InputFieldType.rotX, input);
}
void OnRotYChanged(string input)
{
OnTransformChanged(InputFieldType.rotY, input);
}
void OnRotZChanged(string input)
{
OnTransformChanged(InputFieldType.rotZ, input);
}
void OnScaXChanged(string input)
{
OnTransformChanged(InputFieldType.scaX, input);
}
void OnScaYChanged(string input)
{
OnTransformChanged(InputFieldType.scaY, input);
}
void OnScaZChanged(string input)
{
OnTransformChanged(InputFieldType.scaZ, input);
}
void OnTransformChanged(InputFieldType type, string input)
{
if (selectedObjects.Count == 0)
{
return;
}
float value = 0.0f;
if (!float.TryParse(input, out value))
{
return;
}
if (lastSelectedInputField.type != type)
{
AddUndoRedo(type, value);
}
lastSelectedInputField.value = value;
foreach (GameObject gb in selectedObjects)
{
ChangeTransformValue(gb.transform, type, value);
}
onTransformChanged?.Invoke(selectedObjects);
}
public void OnTransformChanged(List<GameObject> objectTransforms)
{
selectedObjects = objectTransforms;
if (objectTransforms.Count == 0)
{
ResetObjectInfo();
return;
}
bool equalPosX = selectedObjects.All(gb => Mathf.Approximately(gb.transform.position.x, selectedObjects[0].transform.position.x));
bool equalPosY = selectedObjects.All(gb => Mathf.Approximately(gb.transform.position.y, selectedObjects[0].transform.position.y));
bool equalPosZ = selectedObjects.All(gb => Mathf.Approximately(gb.transform.position.z, selectedObjects[0].transform.position.z));
bool equalRotX = selectedObjects.All(gb => Mathf.Approximately(gb.transform.eulerAngles.x, selectedObjects[0].transform.eulerAngles.x));
bool equalRotY = selectedObjects.All(gb => Mathf.Approximately(gb.transform.eulerAngles.y, selectedObjects[0].transform.eulerAngles.y));
bool equalRotZ = selectedObjects.All(gb => Mathf.Approximately(gb.transform.eulerAngles.z, selectedObjects[0].transform.eulerAngles.z));
bool equalScaX = selectedObjects.All(gb => Mathf.Approximately(gb.transform.localScale.x, selectedObjects[0].transform.localScale.x));
bool equalScaY = selectedObjects.All(gb => Mathf.Approximately(gb.transform.localScale.y, selectedObjects[0].transform.localScale.y));
bool equalScaZ = selectedObjects.All(gb => Mathf.Approximately(gb.transform.localScale.z, selectedObjects[0].transform.localScale.z));
Transform t = selectedObjects[0].transform;
if (equalPosX) InputField_PositionX.SetTextWithoutNotify(t.position.x.ToString("F2"));
if (equalPosY) InputField_PositionY.SetTextWithoutNotify(t.position.y.ToString("F2"));
if (equalPosZ) InputField_PositionZ.SetTextWithoutNotify(t.position.z.ToString("F2"));
if (equalRotX) InputField_RotationX.SetTextWithoutNotify(t.eulerAngles.x.ToString("F2"));
if (equalRotY) InputField_RotationY.SetTextWithoutNotify(t.eulerAngles.y.ToString("F2"));
if (equalRotZ) InputField_RotationZ.SetTextWithoutNotify(t.eulerAngles.z.ToString("F2"));
if (equalScaX) InputField_ScaleX.SetTextWithoutNotify(t.localScale.x.ToString("F2"));
if (equalScaY) InputField_ScaleY.SetTextWithoutNotify(t.localScale.y.ToString("F2"));
if (equalScaZ) InputField_ScaleZ.SetTextWithoutNotify(t.localScale.z.ToString("F2"));
}
void AddUndoRedo(InputFieldType type, float value)
{
lastSelectedInputField = new SelectedInput(type, value);
SelectedInput saveSelectedInput = lastSelectedInputField;
List<GameObject> transformsChanged = new List<GameObject>(selectedObjects);
List<float> origValues;
switch (type)
{
case InputFieldType.posX: origValues = transformsChanged.Select(t => t.transform.position.x).ToList(); break;
case InputFieldType.posY: origValues = transformsChanged.Select(t => t.transform.position.y).ToList(); break;
case InputFieldType.posZ: origValues = transformsChanged.Select(t => t.transform.position.z).ToList(); break;
case InputFieldType.rotX: origValues = transformsChanged.Select(t => t.transform.eulerAngles.x).ToList(); break;
case InputFieldType.rotY: origValues = transformsChanged.Select(t => t.transform.eulerAngles.y).ToList(); break;
case InputFieldType.rotZ: origValues = transformsChanged.Select(t => t.transform.eulerAngles.z).ToList(); break;
case InputFieldType.scaX: origValues = transformsChanged.Select(t => t.transform.localScale.x).ToList(); break;
case InputFieldType.scaY: origValues = transformsChanged.Select(t => t.transform.localScale.y).ToList(); break;
case InputFieldType.scaZ: origValues = transformsChanged.Select(t => t.transform.localScale.z).ToList(); break;
default: origValues = new List<float>(transformsChanged.Count); break;
}
ActionCommand command = new ActionCommand(
() =>
{
for (int i = 0; i < transformsChanged.Count; i++)
{
ChangeTransformValue(transformsChanged[i].transform, type, saveSelectedInput.value);
}
onTransformChanged?.Invoke(transformsChanged);
},
() =>
{
for (int i = 0; i < transformsChanged.Count; i++)
{
ChangeTransformValue(transformsChanged[i].transform, type, origValues[i]);
}
onTransformChanged?.Invoke(transformsChanged);
});
CommandInvoker.instance.Invoke(command);
}
void ChangeTransformValue(Transform t, InputFieldType type, float v)
{
switch (type)
{
case InputFieldType.posX: t.position = new Vector3(v, t.position.y, t.position.z); break;
case InputFieldType.posY: t.position = new Vector3(t.position.x, v, t.position.z); break;
case InputFieldType.posZ: t.position = new Vector3(t.position.x, t.position.y, v); break;
case InputFieldType.rotX: t.eulerAngles = new Vector3(v, t.eulerAngles.y, t.eulerAngles.z); break;
case InputFieldType.rotY: t.eulerAngles = new Vector3(t.eulerAngles.x, v, t.eulerAngles.z); break;
case InputFieldType.rotZ: t.eulerAngles = new Vector3(t.eulerAngles.x, t.eulerAngles.y, v); break;
case InputFieldType.scaX: t.localScale = new Vector3(v, t.localScale.y, t.localScale.z); break;
case InputFieldType.scaY: t.localScale = new Vector3(t.localScale.x, v, t.localScale.z); break;
case InputFieldType.scaZ: t.localScale = new Vector3(t.localScale.x, t.localScale.y, v); break;
}
}
void OnDeselectInputField(string lastInput)
{
Debug.Log("Deselect Input Field");
if (lastSelectedInputField.type != InputFieldType.none)
{
lastSelectedInputField = new SelectedInput(InputFieldType.none, 0.0f);
}
}
void OnChangedID(string Id)
{
this.code = Id;
singleSelectObject.ChangeConnectData(code, componetKey, topic, isAuto);
}
public void SetObjectInfo(string name, List<GameObject> selectedObjects)
{
ResetObjectInfo();
if (name == null || selectedObjects == null)
{
return;
}
if (selectedObjects.Count == 0)
{
return;
}
addComponetModal.Open();
connectionModal.gameObject.SetActive(false);
if (selectedObjects.Count == 1)
{
var renderObject = selectedObjects[0].GetComponent<CustomAssetRenderObject>();
if (renderObject != null)
{
singleSelectObject = renderObject;
var searchAsset = GetConnectAsset(renderObject);
componetKey = searchAsset.renderObject.componetKey;
this.code = searchAsset.renderObject.code;
addComponetModal.ChangeItem(componetKey);
InputField_ID.SetTextWithoutNotify(this.code);
if (!string.IsNullOrEmpty(componetKey))
{
connectionModal.gameObject.SetActive(true);
this.topic = searchAsset.renderObject.topic;
this.isAuto = searchAsset.renderObject.isAutoId;
connectionModal.Open();
connectionModal.SetAutoId(isAuto);
if (!string.IsNullOrEmpty(topic))
{
connectionModal.ChangeItem(topic,isAuto);
}
}
InputField_Name.text = searchAsset.assetData.assetName;
}
}
string append = "";
if (!name.Equals("-"))
{
append = string.Format(" ({0})", selectedObjects.Count);
}
//InputField_Name.
//Text_Name.text = name + append;
OnTransformChanged(selectedObjects);
if (lastSelectedInputField.type != InputFieldType.none)
{
lastSelectedInputField = new SelectedInput(InputFieldType.none, 0.0f);
}
}
private ConnectedAsset GetConnectAsset(CustomAssetRenderObject renderObject)
{
var connector = ManagerHub.instance.Get<CustomAssetConnector>();
ConnectedAsset searchAsset = connector.connectedAssets.FirstOrDefault(x => x.renderObject == renderObject);
return searchAsset;
}
public void ResetObjectInfo()
{
InputField_PositionX.SetTextWithoutNotify("-");
InputField_PositionY.SetTextWithoutNotify("-");
InputField_PositionZ.SetTextWithoutNotify("-");
InputField_RotationX.SetTextWithoutNotify("-");
InputField_RotationY.SetTextWithoutNotify("-");
InputField_RotationZ.SetTextWithoutNotify("-");
InputField_ScaleX.SetTextWithoutNotify("-");
InputField_ScaleY.SetTextWithoutNotify("-");
InputField_ScaleZ.SetTextWithoutNotify("-");
InputField_Name.SetTextWithoutNotify("-");
if (lastSelectedInputField.type != InputFieldType.none)
{
lastSelectedInputField = new SelectedInput(InputFieldType.none, 0.0f);
}
}
/// <summary>
/// 추가
/// </summary>
/// <param name="key"></param>
private void AddCompoent(string key)
{
var component = ConfigConnected.ComponetScritable.compoenets.FirstOrDefault(x => x.key.Equals(key));
var type = component.comp.GetType();
if (!singleSelectObject.TryGetComponent(type, out var com))
{
singleSelectObject.AddComponent(type);
var obj = component.comp as AbstractFunctionObject;
var isAuto = obj.ObjectType.Equals(ObjectType.Dynamic) ? true : false;
connectionModal.SetAutoId(isAuto);
}
}
/// <summary>
/// 제거
/// </summary>
/// <param name="key"></param>
private void RemoveAddCompoent(string key)
{
if (string.IsNullOrEmpty(key))
return;
var component = componetScriptable.compoenets.FirstOrDefault(x => x.key.Equals(key));
var type = component.comp.GetType();
if (singleSelectObject.TryGetComponent(type, out var com))
Destroy(com);
}
private void ChangeCompoentItem(string key)
{
var prevKey = singleSelectObject.componetKey;
if (!string.IsNullOrEmpty(prevKey) && !prevKey.Equals(key))
{
RemoveAddCompoent(singleSelectObject.componetKey);
}
bool isConnect = string.IsNullOrEmpty(key) ? false : true;
//이전의 키값을 가져와야 함.
//RemoveAddCompoent();
connectionModal.gameObject.SetActive(isConnect);
if (isConnect == false)
{
singleSelectObject.topic = null;
singleSelectObject.isAutoId = false;
singleSelectObject.componetKey = key;
return;
}
AddCompoent(key);
connectionModal.Open();
componetKey = key;
singleSelectObject.ChangeConnectData(code, componetKey, topic, isAuto);
}
private void ChangeTopicItem(string key)
{
topic = key;
singleSelectObject.ChangeConnectData(code, componetKey, topic, isAuto);
}
private void ChangeToggleItem(bool isAuto)
{
this.isAuto = isAuto;
singleSelectObject.ChangeConnectData(code, componetKey, topic, isAuto);
}
private void OnClickConnectDataButton()
{
onConnectedData?.Invoke();
}
private void OnClickConnectAlarmButton()
{
onConnectedAlarm?.Invoke();
}
private void OnClickRetouchAlarmButton()
{
//onRetouchAlarm?.Invoke(Text_AlarmName.text);
}
}
}
//private TextMeshProUGUI Text_DataName;
//private Button Button_ConnectData;
//private Button Button_RetouchData;
//private Button Button_DeleteData;
//private TextMeshProUGUI Text_AlarmName;
//private Button Button_ConnectAlarm;
//private Button Button_RetouchAlarm;
//private Button Button_DeleteAlarm;
//private void Update()
//{
// if (Text_DataName.text == "없음")
// {
// Button_ConnectData.gameObject.SetActive(true);
// Button_RetouchData.gameObject.SetActive(false);
// Button_DeleteData.gameObject.SetActive(false);
// }
// else
// {
// Button_ConnectData.gameObject.SetActive(false);
// Button_RetouchData.gameObject.SetActive(true);
// Button_DeleteData.gameObject.SetActive(true);
// }
// if (Text_AlarmName.text == "없음")
// {
// Button_ConnectAlarm.gameObject.SetActive(true);
// Button_RetouchAlarm.gameObject.SetActive(false);
// Button_DeleteAlarm.gameObject.SetActive(false);
// }
// else
// {
// Button_ConnectAlarm.gameObject.SetActive(false);
// Button_RetouchAlarm.gameObject.SetActive(true);
// Button_DeleteAlarm.gameObject.SetActive(true);
// }
//}
//private void OnClickRetouchDataButton()
//{
// onRetouchData?.Invoke(Text_DataName.text);
//}
//private void OnClickDeleteDataButton()
//{
// onDeleteData?.Invoke(Text_DataName.text);
// Text_DataName.SetText("없음");
//}
//public void OnConnectData(string saveDataName, SaveConnectedData saveData)
//{
// Text_DataName.SetText(saveDataName);
// connectedData = saveData;
//}
//private void OnClickDeleteAlarmButton()
//{
// onDeleteAlarm?.Invoke(Text_AlarmName.text);
// Text_AlarmName.SetText("없음");
//}
//public void OnConnectAlarm(string saveAlarmName, SaveConnectAlarmData saveData)
//{
// Text_AlarmName.SetText(saveAlarmName);
// connectedAlarmData = saveData;
//}