com.soviby.unity.ui.ugui-to.../Assets/Editor/Manager/EntityManager.cs

356 lines
14 KiB
C#
Raw Normal View History

2024-10-23 17:30:59 +00:00
#if UNITY_EDITOR
2024-10-29 17:51:06 +00:00
using Sirenix.OdinInspector;
2024-10-28 16:31:38 +00:00
using System.Collections.Generic;
using System.IO;
2024-10-29 17:51:06 +00:00
using UnityEditor;
using UnityEditor.SceneManagement;
2024-10-23 17:30:59 +00:00
using UnityEngine;
namespace UguiToolkit.Editor
{
2024-10-28 16:31:38 +00:00
[ExecuteAlways]
2024-10-23 17:30:59 +00:00
public class EntityManager : MonoBehaviour, IManager
{
private PanelCache m_panelCache;
private Transform m_entityRoot;
private GameObject m_lastSelectionGo;
private IEntity m_lastSelectionEntity;
2024-11-06 17:45:57 +00:00
private GameObject m_curSelectionGo;
2024-10-23 17:30:59 +00:00
private List<ImageEntity> m_imageEntities;
2024-12-01 16:33:27 +00:00
private List<IEntity> m_textEntities;
private List<IEntity> m_selectionEntities;
2024-10-28 16:31:38 +00:00
2024-10-29 17:51:06 +00:00
[LabelText("脱离选择控制"), ShowInInspector]
private bool m_noSelection;
private StageManager m_stageManager;
private HashSet<string> m_checkImgPaths;
private float m_lastCheckTime;
2024-11-28 10:34:17 +00:00
private bool m_useTMP;
private const float m_checkInterval = 2f;
2024-10-29 17:51:06 +00:00
private void OnEnable()
2024-10-28 16:31:38 +00:00
{
2024-11-28 10:34:17 +00:00
var globalMng = GlobalManager.Instance;
globalMng.showHierarchyOfEntityChanged += OnUpdateHierarchyOfEntityAllEntity;
m_useTMP = globalMng.setting.useTMP;
2024-10-29 17:51:06 +00:00
Selection.selectionChanged += OnSelectionChanged;
m_stageManager = StageManager.Instance;
2024-10-29 17:51:06 +00:00
}
private void OnDisable()
{
GlobalManager.Instance.showHierarchyOfEntityChanged -= OnUpdateHierarchyOfEntityAllEntity;
Selection.selectionChanged -= OnSelectionChanged;
}
private void Update()
{
// 检测是否到达可选实例矩形内部
2024-11-06 17:45:57 +00:00
if (m_selectionEntities != null && m_curSelectionGo)
2024-10-29 17:51:06 +00:00
{
2024-11-06 17:45:57 +00:00
if (m_lastSelectionGo && m_lastSelectionGo == m_curSelectionGo)
2024-10-29 17:51:06 +00:00
{
if (m_lastSelectionEntity != null && !m_lastSelectionEntity.IsInside(m_lastSelectionGo.transform))
2024-10-29 17:51:06 +00:00
{
m_lastSelectionGo = null;
m_lastSelectionEntity = null;
2024-10-29 17:51:06 +00:00
}
return;
}
foreach (var entity in m_selectionEntities)
2024-10-29 17:51:06 +00:00
{
2024-11-06 17:45:57 +00:00
var tf = m_curSelectionGo.transform;
2024-10-29 17:51:06 +00:00
if (entity.IsInside(tf))
{
entity.ApplyTransform(tf);
2024-11-06 17:45:57 +00:00
if (tf.TryGetComponent<UnityEngine.UI.Image>(out var image))
{
entity.ApplyData(image);
}
else if (tf.TryGetComponent<UnityEngine.UI.Text>(out var text))
{
entity.ApplyData(text);
}
2024-10-29 17:51:06 +00:00
2024-11-06 17:45:57 +00:00
m_lastSelectionGo = m_curSelectionGo;
m_lastSelectionEntity = entity;
2024-10-29 17:51:06 +00:00
Selection.activeGameObject = null;
break;
}
}
}
// 检测是否有image变更及时更新PanelCache
m_lastCheckTime += Time.deltaTime;
if (m_lastCheckTime > m_checkInterval)
{
m_lastCheckTime = 0;
if (m_checkImgPaths != null)
{
var images = m_stageManager.PrefabContentsRoot.GetComponentsInChildren<UnityEngine.UI.Image>();
foreach (var image in images)
{
if (image.transform.parent == m_entityRoot || image.sprite == null) continue;
var srcImgPath = AssetDatabase.GetAssetPath(image.sprite);
if (!m_checkImgPaths.Contains(srcImgPath))
{
var srcImgDirPath = System.IO.Path.GetDirectoryName(srcImgPath);
string projectPath = Directory.GetParent(Application.dataPath).FullName;
foreach (var filePath in System.IO.Directory.GetFiles(srcImgDirPath))
{
var _filePath = Path.GetRelativePath(projectPath, filePath).Replace("\\", "/");
m_checkImgPaths.Add(_filePath);
}
UpdatePanelCache(srcImgDirPath, m_panelCache.TargetImgDirPath);
break;
}
}
}
2024-10-29 17:51:06 +00:00
}
2024-10-28 16:31:38 +00:00
}
private void InitCheckImgPaths()
{
if (m_checkImgPaths == null) m_checkImgPaths = new HashSet<string>();
2024-11-28 17:06:27 +00:00
//var images = m_stageManager.PrefabContentsRoot.GetComponentsInChildren<UnityEngine.UI.Image>();
//foreach (var image in images)
//{
// if (image.sprite == null) continue;
// var srcImgPath = AssetDatabase.GetAssetPath(image.sprite);
// m_checkImgPaths.Add(srcImgPath);
//}
}
private void UpdatePanelCache(string srcImgDirPath, string targetImgDirPath)
{
2024-11-07 16:16:28 +00:00
float distanceDifference = GlobalManager.Instance.setting.distanceDifference;
CacheScriptObject.CalcRotScaleInfos(srcImgDirPath, targetImgDirPath, distanceDifference,(rotScaleInfoMap) =>
{
if (!m_stageManager) return;
// 拷贝数据
if (m_panelCache.rotScaleInfos != null)
{
foreach (var kv in rotScaleInfoMap)
{
if (!m_panelCache.rotScaleInfos.TryGetValue(kv.Key, out var rotScaleInfos))
{
m_panelCache.rotScaleInfos[kv.Key] = kv.Value;
}
}
} else
{
m_panelCache.rotScaleInfos = rotScaleInfoMap;
}
// 保存缓存
GlobalManager.Instance.SaveCache(m_stageManager.PrefabAsset, m_panelCache);
});
}
2024-10-29 17:51:06 +00:00
private void OnSelectionChanged()
2024-10-28 16:31:38 +00:00
{
2024-11-06 17:45:57 +00:00
m_curSelectionGo = null;
m_selectionEntities.Clear();
2024-11-06 17:45:57 +00:00
m_entityRoot.gameObject.SetActive(false);
2024-10-29 17:51:06 +00:00
2024-11-06 17:45:57 +00:00
if (m_noSelection) return;
2024-10-29 17:51:06 +00:00
if (Selection.activeGameObject != null && m_panelCache != null)
{
var activeGameObject = Selection.activeGameObject;
if (activeGameObject.transform.parent == m_entityRoot) return;
2024-10-29 17:51:06 +00:00
if (activeGameObject.TryGetComponent<UnityEngine.UI.Image>(out var image))
{
var rotScaleInfos = m_panelCache.rotScaleInfos;
if (rotScaleInfos == null) return;
if (image.sprite == null) return;
var srcImgPath = AssetDatabase.GetAssetPath(image.sprite);
if (!rotScaleInfos.TryGetValue(srcImgPath, out var rotScaleInfoItems)) return;
m_entityRoot.gameObject.SetActive(true);
2024-10-29 17:51:06 +00:00
bool isFind;
2024-11-06 17:45:57 +00:00
bool IsInside = false;
foreach (var imgEntity in m_imageEntities)
2024-10-29 17:51:06 +00:00
{
isFind = false;
foreach (var rotScale in rotScaleInfoItems)
{
var imgInfo = imgEntity.ElementInfo;
2024-12-01 16:33:27 +00:00
if ( (imgInfo.HaveSlice && imgInfo.imgSlicePath == rotScale.imgPath) || imgInfo.imgPath == rotScale.imgPath)
2024-10-29 17:51:06 +00:00
{
if (rotScale.similarityCalc)
{
imgEntity.SetTransform(0, new Unity.Mathematics.float2(1, 1), true);
}
else {
imgEntity.SetTransform(rotScale.rotiation, rotScale.scale, false);
}
2024-10-29 17:51:06 +00:00
imgEntity.ShowSelectionImg(true);
m_selectionEntities.Add(imgEntity);
2024-10-29 17:51:06 +00:00
2024-11-06 17:45:57 +00:00
if (!IsInside && imgEntity.IsInside(activeGameObject.transform)) IsInside = true;
2024-10-29 17:51:06 +00:00
isFind = true;
break;
}
}
imgEntity.gameObject.SetActive(isFind);
}
2024-11-06 17:45:57 +00:00
if (IsInside)
{
if (m_lastSelectionGo && m_lastSelectionGo == activeGameObject)
{
m_curSelectionGo = activeGameObject;
}
}
else {
m_curSelectionGo = activeGameObject;
}
foreach (var textEntity in m_textEntities)
2024-10-29 17:51:06 +00:00
{
textEntity.gameObject.SetActive(false);
}
}
else if (activeGameObject.TryGetComponent<UnityEngine.UI.Text>(out var text))
{
2024-11-06 17:45:57 +00:00
bool IsInside = false;
m_entityRoot.gameObject.SetActive(true);
foreach (var textEntity in m_textEntities)
{
textEntity.ShowSelectionImg(true);
textEntity.gameObject.SetActive(true);
m_selectionEntities.Add(textEntity);
if (!IsInside && textEntity.IsInside(activeGameObject.transform)) IsInside = true;
}
2024-10-29 17:51:06 +00:00
2024-11-06 17:45:57 +00:00
if (IsInside)
{
if (m_lastSelectionGo && m_lastSelectionGo == activeGameObject)
{
m_curSelectionGo = activeGameObject;
}
}
else
{
m_curSelectionGo = activeGameObject;
}
foreach (var imgEntity in m_imageEntities)
{
imgEntity.gameObject.SetActive(false);
}
2024-10-29 17:51:06 +00:00
}
}
2024-10-28 16:31:38 +00:00
}
2024-10-23 17:30:59 +00:00
public void InitAllEntity(PanelCache panelCache)
{
this.m_panelCache = panelCache;
// 创建所有实例
CreateAllEntity();
InitCheckImgPaths();
2024-10-23 17:30:59 +00:00
}
2024-10-29 17:51:06 +00:00
private void OnUpdateHierarchyOfEntityAllEntity(bool show)
2024-10-28 16:31:38 +00:00
{
UpdateHierarchyOfEntity(show, m_entityRoot.gameObject);
foreach (var entity in m_imageEntities) UpdateHierarchyOfEntity(show, entity.gameObject);
foreach (var entity in m_textEntities) UpdateHierarchyOfEntity(show, entity.gameObject);
2024-10-28 16:31:38 +00:00
}
private void UpdateHierarchyOfEntity(in bool show, in GameObject entity)
{
2024-10-29 17:51:06 +00:00
EntityHelper.UpdateHierarchyAndSceneVisibilityOfEntity(show, entity.gameObject);
2024-10-28 16:31:38 +00:00
}
2024-10-23 17:30:59 +00:00
private void CreateAllEntity()
{
if (this.m_panelCache == null) return;
var go = new GameObject("__entityRoot__", typeof(RectTransform));
2024-10-28 16:31:38 +00:00
UpdateHierarchyOfEntity(false, go);
m_entityRoot = go.transform;
m_entityRoot.SetParent(transform);
m_entityRoot.localPosition = Vector3.zero;
m_entityRoot.localRotation = Quaternion.identity;
m_entityRoot.localScale = Vector3.one;
2024-10-28 16:31:38 +00:00
m_imageEntities = new(m_panelCache.layoutInfo.Count);
m_textEntities = new(m_panelCache.layoutInfo.Count);
m_selectionEntities = new(m_panelCache.layoutInfo.Count);
2024-10-28 16:31:38 +00:00
foreach (var elementInfo in m_panelCache.GetLayoutElementInfos<LayoutInfo.ElementInfo>())
2024-10-23 17:30:59 +00:00
{
2024-10-28 16:31:38 +00:00
var imgInfo = elementInfo as LayoutInfo.ImageInfo;
if (imgInfo != null) // Image
{
2024-11-28 10:34:17 +00:00
go = new GameObject(imgInfo.name, typeof(RectTransform));
2024-10-28 16:31:38 +00:00
var entity = go.AddComponent<ImageEntity>();
entity.transform.SetParent(m_entityRoot);
2024-10-28 16:31:38 +00:00
entity.transform.SetSiblingIndex(0);
2024-10-23 17:30:59 +00:00
2024-10-28 16:31:38 +00:00
entity.SetData(imgInfo);
2024-12-01 16:33:27 +00:00
entity.InitPreview();
2024-10-28 16:31:38 +00:00
m_imageEntities.Add(entity);
2024-10-28 16:31:38 +00:00
UpdateHierarchyOfEntity(false, entity.gameObject);
2024-12-01 16:33:27 +00:00
// 创建九宫格
2024-10-28 16:31:38 +00:00
continue;
}
var textInfo = elementInfo as LayoutInfo.TextInfo;
if (textInfo != null) // Text
{
2024-11-28 10:34:17 +00:00
if (m_useTMP)
{
go = new GameObject(textInfo.text, typeof(RectTransform));
var entity = go.AddComponent<TextMeshProEntity>();
entity.transform.SetParent(m_entityRoot);
entity.transform.SetSiblingIndex(0);
2024-10-28 16:31:38 +00:00
2024-11-28 10:34:17 +00:00
entity.SetData(textInfo);
2024-12-01 16:33:27 +00:00
entity.InitPreview();
2024-10-23 17:30:59 +00:00
2024-12-01 16:33:27 +00:00
m_textEntities.Add(entity);
2024-11-28 10:34:17 +00:00
UpdateHierarchyOfEntity(false, entity.gameObject);
continue;
}
else
{
go = new GameObject(textInfo.text, typeof(RectTransform));
var entity = go.AddComponent<TextEntity>();
entity.transform.SetParent(m_entityRoot);
entity.transform.SetSiblingIndex(0);
2024-10-28 16:31:38 +00:00
2024-11-28 10:34:17 +00:00
entity.SetData(textInfo);
2024-12-01 16:33:27 +00:00
entity.InitPreview();
2024-11-28 10:34:17 +00:00
m_textEntities.Add(entity);
UpdateHierarchyOfEntity(false, entity.gameObject);
continue;
}
}
2024-10-28 16:31:38 +00:00
}
2024-10-29 17:51:06 +00:00
m_entityRoot.gameObject.SetActive(false);
2024-10-23 17:30:59 +00:00
}
}
}
#endif