TheInitialProject/Assets/CaoCao/Scripts/Editor/XAsset/Simulation/EditorInitializeHandler.cs
2024-10-23 16:59:02 +08:00

162 lines
5.3 KiB
C#

using CaoCao.XAsset;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
namespace CaoCao.Editor
{
public struct EditorInitializeHandler : IInitializeHandler
{
public void OnUpdated(InitializeRequest request)
{
if (Collecting(request)) return;
request.progress = 1;
request.SetResult(Request.Result.Success);
}
private bool Collecting(Request request)
{
return _collectFunc.Invoke(request);
}
private bool CollectAll(Request request)
{
while (_queue.Count > 0)
{
var group = _queue.Dequeue();
switch (group.addressMode)
{
case AddressMode.LoadByDependencies:
case AddressMode.LoadByPath:
{
var assets = Settings.Collect(group);
_collectedAssets.UnionWith(Array.ConvertAll(assets, input => input.path));
}
break;
case AddressMode.LoadByName:
{
var assets = Settings.Collect(group);
foreach (var asset in assets)
{
AddressManager.SetAddress(asset.path, Path.GetFileName(asset.path));
}
_collectedAssets.UnionWith(Array.ConvertAll(assets, input => input.path));
}
break;
case AddressMode.LoadByNameWithoutExtension:
{
var assets = Settings.Collect(group);
foreach (var asset in assets)
{
AddressManager.SetAddress(asset.path, Path.GetFileNameWithoutExtension(asset.path));
}
_collectedAssets.UnionWith(Array.ConvertAll(assets, input => input.path));
}
break;
}
request.progress = (max - _queue.Count) * 1f / max;
if (Scheduler.Busy) return true;
}
return false;
}
private bool CollectFast(Request request)
{
while (_queue.Count > 0)
{
var group = _queue.Dequeue();
switch (group.addressMode)
{
case AddressMode.LoadByDependencies:
case AddressMode.LoadByPath:
break;
case AddressMode.LoadByName:
{
var assets = Settings.Collect(group);
foreach (var asset in assets)
{
AddressManager.SetAddress(asset.path, Path.GetFileName(asset.path));
}
}
break;
case AddressMode.LoadByNameWithoutExtension:
{
var assets = Settings.Collect(group);
foreach (var asset in assets)
{
AddressManager.SetAddress(asset.path, Path.GetFileNameWithoutExtension(asset.path));
}
}
break;
}
request.progress = (max - _queue.Count) * 1f / max;
if (Scheduler.Busy) return true;
}
return false;
}
private Queue<BuildGroup> _queue;
private int max;
private HashSet<string> _collectedAssets;
private Func<Request, bool> _collectFunc;
public void OnStart(InitializeRequest request)
{
_collectedAssets = new HashSet<string>();
_queue = new Queue<BuildGroup>();
var settings = Settings.GetDefaultSettings();
Assets.Versions = ScriptableObject.CreateInstance<Versions>();
Assets.PlayerAssets = ScriptableObject.CreateInstance<PlayerAssets>();
if (settings.collectAllAssets)
{
_collectFunc = CollectAll;
Assets.ContainsFunc = ContainsFuncAll;
}
else
{
Assets.ContainsFunc = ContainsFuncFast;
_collectFunc = CollectFast;
}
var groups = Settings.FindAssets<BuildGroup>();
max = groups.Length;
foreach (var group in groups)
_queue.Enqueue(group);
}
private bool ContainsFuncAll(string path)
{
if (!ContainsFuncFast(path))
return false;
if (_collectedAssets.Contains(path)) return true;
EditorUtility.DisplayDialog("错误", $"资源没有被采集:{path}", "确定");
return false;
}
private static bool ContainsFuncFast(string path)
{
var result = File.Exists(path);
if (!result)
EditorUtility.DisplayDialog("错误", $"工程中找不到文件:{path}", "确定");
return result;
}
public static IInitializeHandler CreateInstance()
{
return new EditorInitializeHandler();
}
}
}