162 lines
5.3 KiB
C#
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();
|
|
}
|
|
}
|
|
} |