125 lines
3.5 KiB
C#
125 lines
3.5 KiB
C#
using System;
|
||
using System.Collections.Generic;
|
||
using System.IO;
|
||
using PhxhSDK;
|
||
using Sirenix.OdinInspector;
|
||
using UnityEngine;
|
||
using cfg.ShowCfg;
|
||
|
||
#if UNITY_EDITOR
|
||
using UnityEditor;
|
||
#endif
|
||
|
||
[CreateAssetMenu(menuName = "演出TimeLine收集")]
|
||
public class CampTimeLineCollector : ScriptableObject
|
||
{
|
||
private const string PATH = "Assets/Art/Show/ShowTimelineCollector.asset";
|
||
|
||
private static CampTimeLineCollector instance;
|
||
|
||
public static CampTimeLineCollector Instance
|
||
{
|
||
get
|
||
{
|
||
if (instance == null)
|
||
{
|
||
instance = AssetManager.Instance.LoadAsset<CampTimeLineCollector>(PATH);
|
||
instance.Init();
|
||
}
|
||
|
||
return instance;
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 所有Timeline资源路径
|
||
/// </summary>
|
||
[ReadOnly]
|
||
[SerializeField]
|
||
private List<string> listAllTimelineAssetPath = new();
|
||
|
||
/// <summary>
|
||
/// 外层key:演出场景类型,内层key:Timeline的ID,value:资源路径
|
||
/// </summary>
|
||
private readonly Dictionary<E_ShowSceneType, Dictionary<int, string>> dicShowTimeline = new();
|
||
|
||
public string this[E_ShowSceneType type, int id]
|
||
{
|
||
get
|
||
{
|
||
if (!dicShowTimeline.TryGetValue(type, out var dicTimeline))
|
||
{
|
||
DebugUtil.LogError("不存在的演出场景类型");
|
||
return string.Empty;
|
||
}
|
||
|
||
if (!dicTimeline.TryGetValue(id, out string path))
|
||
{
|
||
DebugUtil.LogError("不存在的TimelineId");
|
||
return string.Empty;
|
||
}
|
||
|
||
return path;
|
||
}
|
||
}
|
||
|
||
private void Init()
|
||
{
|
||
dicShowTimeline.Clear();
|
||
foreach (string path in listAllTimelineAssetPath)
|
||
{
|
||
DirectoryInfo directoryInfo = new(path);
|
||
if (!Enum.TryParse(directoryInfo.Parent.Name, false, out E_ShowSceneType result))
|
||
{
|
||
DebugUtil.LogError($"timeline文件夹错误,没有和{typeof(E_ShowSceneType).Name}对应");
|
||
continue;
|
||
}
|
||
|
||
string timeLineName = Path.GetFileNameWithoutExtension(path);
|
||
int index = timeLineName.LastIndexOf("_", StringComparison.Ordinal);
|
||
if (index < 0)
|
||
{
|
||
DebugUtil.LogError($"timeline名字中找不到_,path:{path}");
|
||
continue;
|
||
}
|
||
|
||
string idStr = timeLineName[(index + 1)..];
|
||
if (!int.TryParse(idStr, out int id))
|
||
{
|
||
DebugUtil.LogError($"timeline名字中找不到id,path:{path}");
|
||
continue;
|
||
}
|
||
|
||
if (!dicShowTimeline.TryGetValue(result, out var dicTimeline))
|
||
{
|
||
dicTimeline = new Dictionary<int, string>();
|
||
dicShowTimeline.Add(result, dicTimeline);
|
||
}
|
||
|
||
dicTimeline.Add(id, path);
|
||
}
|
||
}
|
||
|
||
#if UNITY_EDITOR
|
||
[MenuItem("Tools/演出/收集所有Timeline")]
|
||
private static void CollectAllTimeLineInMenu()
|
||
{
|
||
Instance.CollectAllTimeLine();
|
||
}
|
||
|
||
public void CollectAllTimeLine()
|
||
{
|
||
EditorUtility.SetDirty(this);
|
||
listAllTimelineAssetPath.Clear();
|
||
string[] guids = AssetDatabase.FindAssets("t:TimelineAsset", new[] { "Assets/Art/Show" });
|
||
foreach (string guid in guids)
|
||
{
|
||
string path = AssetDatabase.GUIDToAssetPath(guid);
|
||
listAllTimelineAssetPath.Add(path);
|
||
}
|
||
|
||
AssetDatabase.SaveAssets();
|
||
AssetDatabase.Refresh();
|
||
}
|
||
#endif
|
||
} |