Files
plugin-library/Assets/06.UIFarme/RunTime/UIFramework/UIControlBinding/Scripts/UIBindingPrefabSaveHelper.cs
2025-09-23 11:18:38 +08:00

116 lines
3.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#if UNITY_EDITOR
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Reflection;
using UnityEditor;
using UnityEditor.Experimental.SceneManagement;
#if UNITY_2019_1_OR_NEWER
#if UNITY_2020_1_OR_NEWER
using UnityEditor.SceneManagement;
# else
using UnityEditor.Experimental.SceneManagement;
# endif
#endif
namespace Stary.Evo
{
public class UIBindingPrefabSaveHelper : UnityEditor.AssetModificationProcessor
{
static UIBindingPrefabSaveHelper()
{
#if UNITY_2019_1_OR_NEWER
PrefabStage.prefabSaving += OnPrefabStageSaving;
#endif
}
#if UNITY_2019_1_OR_NEWER
/// <summary>
/// 当点击Perfab编辑场景的Save按钮时修改数据不会立刻保存因此需要在其执行前主动保存一下
/// </summary>
/// <param name="go"></param>
static void OnPrefabStageSaving(GameObject go)
{
string path = AssetDatabase.GetAssetPath(go);
OnWillSaveAssets(new string[] { path });
AssetDatabase.SaveAssets();
}
#endif
/// <summary>
/// 保存资源时修正控件绑定数据
/// </summary>
/// <param name="paths"></param>
/// <returns></returns>
static string[] OnWillSaveAssets(string[] paths)
{
GameObject goInHierarchy = Selection.activeGameObject;
if(goInHierarchy != null)
{
// 从根节点开始遍历以免当前prefab有多个子UI修改时无法被全部修正
var rootTran = goInHierarchy.transform;
while (rootTran.parent != null)
rootTran = rootTran.parent;
UIControlData[] uiControlData = rootTran.GetComponentsInChildren<UIControlData>();
if (uiControlData != null)
{
foreach (var comp in uiControlData)
{
comp.CorrectComponents();
comp.CheckSubUIs();
}
}
}
return paths;
}
public static void SavePrefab(GameObject goInHierarchy)
{
Object goPrefab = null;
GameObject objValid = null;
GameObject objToCheck = goInHierarchy;
string prefabPath = null;
do
{
#if UNITY_2019_1_OR_NEWER
var currPrefab = PrefabUtility.GetCorrespondingObjectFromSource(objToCheck);
#else
var currPrefab = PrefabUtility.GetPrefabParent(objToCheck);
#endif
if (currPrefab == null)
break;
string currPath = AssetDatabase.GetAssetPath(currPrefab);
if (prefabPath == null)
prefabPath = currPath;
if (currPath != prefabPath) // 已经到root或者当前是嵌套prefab并且已经到达上一层prefab
break;
goPrefab = currPrefab;
objValid = objToCheck;
var t = objToCheck.transform.parent;
if (t != null)
objToCheck = t.gameObject;
else
break;
} while (true);
if (objValid != null)
#if UNITY_2019_1_OR_NEWER
goPrefab = PrefabUtility.SaveAsPrefabAssetAndConnect(objValid, prefabPath, InteractionMode.AutomatedAction);
#else
PrefabUtility.ReplacePrefab(goInHierarchy, goPrefab, ReplacePrefabOptions.ConnectToPrefab);
#endif
else
Debug.LogFormat("<color=red>当前对象不属于Prefab, 请将其保存为 Prefab</color>");
}
}
}
#endif