using System;
using System.Collections.Generic;
using System.IO;
using ET;
using UnityEditor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace YIUIFramework.Editor
{
///
/// 面板逆向 转换为源数据
///
public static class MenuItemYIUIPanelToSource
{
[MenuItem("Assets/YIUI/Panel 逆向 源数据 Source", false, -1)]
static void CreateYIUIPanelByFolder()
{
var activeObject = Selection.activeObject as GameObject;
if (activeObject == null)
{
UnityTipsHelper.ShowError("必须选择一个Panel 对象");
return;
}
var path = AssetDatabase.GetAssetPath(Selection.activeObject);
var containsPath = $"{YIUIConstHelper.Const.UIProjectResPath}/";
if (!path.Contains(containsPath))
{
UnityTipsHelper.ShowError($"请在路径 {YIUIConstHelper.Const.UIProjectResPath}/xxx/ 下右键选择一个Panel 进行转换");
return;
}
var parts = path.Split(new[] { containsPath }, StringSplitOptions.None);
if (parts.Length < 2)
{
Log.Error("路径中没有找到预制件。");
return;
}
var pathRoot = parts[0];
var pkgName = parts[1].Split('/')[0];
var panelCdeTable = activeObject.GetComponent();
if (panelCdeTable == null)
{
UnityTipsHelper.ShowError("预设错误 没有 UIBindCDETable");
return;
}
if (panelCdeTable.UICodeType != EUICodeType.Panel)
{
UnityTipsHelper.ShowError("预设错误 必须是Panel");
return;
}
if (panelCdeTable.IsSplitData)
{
UnityTipsHelper.ShowError("这是一个源数据 无法逆向转换");
return;
}
if (string.IsNullOrEmpty(panelCdeTable.PkgName))
{
panelCdeTable.AutoCheck();
}
if (string.IsNullOrEmpty(panelCdeTable.PkgName))
{
UnityTipsHelper.ShowError("未知错误 无法识别 包名");
return;
}
var newSourceName = $"{panelCdeTable.name}{YIUIConstHelper.Const.UISource}";
var savePath = $"{pathRoot}{containsPath}{pkgName}/{YIUIConstHelper.Const.UISource}/{newSourceName}.prefab";
//TODO 有人不按要求操作直接不使用view 关联了其他组件 这个组件的引用逆向时会无法关联
if (AssetDatabase.LoadAssetAtPath(savePath, typeof(Object)) != null)
{
UnityTipsHelper.CallBack("源数据已存在!!! 此操作将会覆盖旧的数据!!!", () => { CreateNewSource(path, savePath); });
}
else
{
CreateNewSource(path, savePath);
}
}
public static void CreateNewSource(string loadPath, string savePath, bool showTips = true)
{
var loadPanel = (GameObject)AssetDatabase.LoadAssetAtPath(loadPath, typeof(Object));
if (loadPanel == null)
{
UnityTipsHelper.ShowError($"未知错误 没有加载到Panel 请检查 {loadPath}");
return;
}
var newSource = UIMenuItemHelper.CopyGameObject(loadPanel);
var oldCdeTable = newSource.GetComponent();
oldCdeTable.IsSplitData = true;
newSource.name = $"{loadPanel.name}{YIUIConstHelper.Const.UISource}";
CorrelationView(oldCdeTable);
var pathRoot = Path.GetDirectoryName(savePath);
if (!Directory.Exists(pathRoot))
{
Directory.CreateDirectory(pathRoot);
}
PrefabUtility.SaveAsPrefabAsset(newSource, savePath);
Object.DestroyImmediate(newSource);
if (showTips)
{
UnityTipsHelper.Show($"Panel 逆向 源数据 完毕");
}
AssetDatabase.Refresh();
}
//关联UI
private static void CorrelationView(UIBindCDETable cdeTable)
{
CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllCommonView);
CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllCreateView);
CorrelationViewByParent(cdeTable.PkgName, cdeTable.PanelSplitData.AllPopupView);
}
private static void CorrelationViewByParent(string pkgName, List parentList)
{
foreach (var viewParent in parentList)
{
if (viewParent == null) continue;
var viewName = viewParent.name.Replace(YIUIConstHelper.Const.UIParentName, "");
//防止修改了生成的view路径 所以改为全局查找
//var viewPath = $"{m_PanelPath}/{YIUIConstHelper.Const.UIPrefabs}/{viewName}.prefab";
var viewPath = UIMenuItemHelper.GetOnlyPrefabAssetsPath(viewName);
if (string.IsNullOrEmpty(viewPath))
{
Log.Error($"未找到 {viewName} 预制件");
continue;
}
var childView = viewParent.FindChildByName(viewName);
if (childView != null)
{
Object.DestroyImmediate(childView.gameObject);
}
AddView(viewPath, viewParent);
}
}
//吧其他view 关联上
private static void AddView(string loadPath, Transform parent)
{
var loadView = (GameObject)AssetDatabase.LoadAssetAtPath(loadPath, typeof(Object));
if (loadView == null)
{
UnityTipsHelper.ShowError($"未知错误 没有加载到 请检查 {loadPath} 是否修改了路径 必须在Prefabs目录下 与Panel同级");
return;
}
var prefabInstance = PrefabUtility.InstantiatePrefab(loadView, parent) as GameObject;
if (prefabInstance == null)
{
Debug.LogError($"{loadView.name} 未知错误 得到一个null 对象");
}
}
}
}