using System;
using System.Collections;
using System.IO;
using TriLib;
using UnityEngine;
using UnityEngine.Networking;
using XRTool.Util;
using Newtonsoft.Json;
namespace ShadowStudio.Model
{
public enum ArtState
{
UnLoad = -1,
Loading = 0,
Loaded = 1
}
///
/// 外部资源加载
/// 可能是模型 zip文件
/// 可能是图片
/// 可能是视频,视频可在线播放,无需下载
///
public class ExtralLoadHandler : ArtInstanceHandler
{
private ArtState artState = ArtState.UnLoad;
private Action loadPorcess;
private Action artLoaded;
public override UnityEngine.Object InstanceArt()
{
return LoadCache;
}
///
/// 异步加载资源
/// 此函数仅加载资源,不负责下载和解压
/// 与异步获取icon不同,异步获取icon,当不存在文件时,会先下载资源再加载
///
///
///
///
///
public override IEnumerator LoadAsyn(string path, Action process, Action loaded)
{
if (Info.ArtType == ArtType.Movies)
{
process?.Invoke(1);
loaded(null);
}
else if (Info.ArtType == ArtType.Image)
{
//Texture icon = GetIcon();
//yield return icon;
//if (icon)
//{
// LoadCache = icon;
// process?.Invoke(1);
// loaded?.Invoke(LoadCache);
//}
//else
//{
// GetIcon((tex) =>
// {
// LoadCache = tex;
// process?.Invoke(1);
// loaded?.Invoke(LoadCache);
// });
//}
if (LoadCache)
{
process?.Invoke(1);
loaded?.Invoke(LoadCache);
yield break;
}
else
{
string url = Info.Url;
if (string.IsNullOrEmpty(url))
{
url = Info.Icon;
}
string serverPath = ResourcesManager.ArtServerPath + "/" + url;// Path.Combine(ResourcesManager.ArtServerPath, url);
string filePath = Path.Combine(localExtralPath, url);
try
{
///文件不存在,下载
///下载后,加载
DownloadHandlerTexture texHander = new DownloadHandlerTexture(true);
if (!File.Exists(filePath))
{
GameSession.Instance.StartCoroutine(DataFileUtil.DownLoadData(serverPath, filePath, (isComplete, handler) =>
{
LoadTexture((tex) =>
{
LoadCache = tex;
process?.Invoke(1);
loaded?.Invoke(LoadCache);
}, handler.downloadHandler);
}, texHander));
}
else
{
GameSession.Instance.StartCoroutine(DataFileUtil.RequestDownData(@"file://" + filePath, (isComplete, handler) =>
{
LoadTexture((tex) =>
{
LoadCache = tex;
process?.Invoke(1);
loaded?.Invoke(LoadCache);
}, handler.downloadHandler);
}, texHander));
}
}
catch (Exception ex)
{
UnityLog.Instance.LogError(JsonConvert.SerializeObject(Info) + "icon error" + ex.ToString());
}
}
}
else if (Info.ArtType == ArtType.Model)
{
if (LoadCache)
{
string cloneName = LoadCache.name;
LoadCache = GameObject.Instantiate(LoadCache);
LoadCache.name = cloneName;
loaded?.Invoke(LoadCache);
yield break;
}
if (artState == ArtState.Loading)
{
loadPorcess += (p) => process?.Invoke(p);
artLoaded += (obj) =>
{
string cloneName = LoadCache.name;
LoadCache = GameObject.Instantiate(LoadCache);
LoadCache.name = cloneName;
loaded?.Invoke(LoadCache);
artLoaded = null;
loadPorcess = null;
};
yield break;
}
if (artState == ArtState.UnLoad)
{
artState = ArtState.Loading;
}
string url = Info.Url;
string serverPath = Path.Combine(ResourcesManager.ArtServerPath, url);
string filePath = Path.Combine(localExtralPath, url);
try
{
///文件不存在,下载
///模型的图例?是否下载呢?是个问题
if (!File.Exists(filePath))
{
GameSession.Instance.StartCoroutine(DataFileUtil.DownLoadData(serverPath, filePath, (isComplete, handler) =>
{
if (handler != null)
{
LoadInternal(filePath, loaded, handler.downloadHandler.data);
}
else
{
UnityLog.Instance.LogError(JsonConvert.SerializeObject(Info) + "frist load error!");
}
}, null, (all, cur) =>
{
DownProcess = cur;
process?.Invoke(cur);
loadPorcess?.Invoke(cur);
}));
}
else
{
GameSession.Instance.StartCoroutine(DataFileUtil.RequestDownData(filePath, (tmppath, handler) =>
{
LoadInternal(filePath, loaded, handler.downloadHandler != null ? handler.downloadHandler.data : null);
}, null, (all, cur) =>
{
DownProcess = cur;
process?.Invoke(cur);
loadPorcess?.Invoke(cur);
}));
}
}
catch
{
loaded?.Invoke(null);
UnityLog.Instance.LogError(Info.ArtId + "load exception!");
}
}
yield return null;
}
///
/// 加载模型
///
///
///
private void LoadModel(string filePath, Action loaded)
{
using (var assetLoader = new AssetLoaderAsync())
{
try
{
var assetLoaderOptions = AssetLoaderOptions.CreateInstance();
assetLoaderOptions.RotationAngles = new Vector3(90f, 180f, 0f);
assetLoaderOptions.AutoPlayAnimations = true;
assetLoader.LoadFromFile(filePath, assetLoaderOptions, null, (loadedGameObject) =>
{
LoadCache = loadedGameObject;
loaded?.Invoke(loadedGameObject);
});
}
catch (Exception e)
{
Debug.LogError(e.ToString());
loaded?.Invoke(null);
}
}
}
private AssetLoaderOptions GetAssetLoaderOptions()
{
var assetLoaderOptions = AssetLoaderOptions.CreateInstance();
assetLoaderOptions.DontLoadCameras = false;
assetLoaderOptions.DontLoadLights = false;
assetLoaderOptions.UseCutoutMaterials = false;
assetLoaderOptions.AddAssetUnloader = true;
return assetLoaderOptions;
}
private void LoadInternal(string filename, Action loaded, byte[] fileBytes = null)
{
//_loadingTimer.Reset();
//_loadingTimer.Start();
//PreLoadSetup();
var assetLoaderOptions = GetAssetLoaderOptions();
using (var assetLoader = new AssetLoaderAsync())
{
//assetLoader.OnMetadataProcessed += AssetLoader_OnMetadataProcessed;
try
{
if (fileBytes != null && fileBytes.Length > 0)
{
var extension = FileUtils.GetFileExtension(filename);
assetLoader.LoadFromMemoryWithTextures(fileBytes, extension, assetLoaderOptions, null, delegate (GameObject loadedGameObject)
{
LoadCache = loadedGameObject;
loaded?.Invoke(LoadCache);
artLoaded?.Invoke(LoadCache);
artState = ArtState.Loaded;
});
}
else if (!string.IsNullOrEmpty(filename))
{
assetLoader.LoadFromFileWithTextures(filename, assetLoaderOptions, null, delegate (GameObject loadedGameObject)
{
LoadCache = loadedGameObject;
loaded?.Invoke(LoadCache);
artLoaded?.Invoke(LoadCache);
artState = ArtState.Loaded;
});
}
else
{
loaded?.Invoke(null);
artLoaded?.Invoke(null);
artState = ArtState.UnLoad;
throw new Exception("File not selected");
}
}
catch
{
loaded?.Invoke(null);
artLoaded?.Invoke(null);
artState = ArtState.UnLoad;
UnityLog.Instance.LogError(Info.ArtId + "资源加载失败");
}
}
}
}
}