Files
Main/Assets/Editor/DIY/Package/TestReadBundle.cs
2025-01-25 04:38:09 +08:00

357 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Thousandto.Core.Asset;
using Thousandto.Core.Base;
using Thousandto.Launcher.ExternalLibs;
using System;
using System.Collections.Generic;
using System.IO;
using UnityEditor;
using UnityEngine;
using JSONNode = UnityEngine.Gonbest.MagicCube.JSONNode;
using JSON = UnityEngine.Gonbest.MagicCube.JSON;
using PathUtils = UnityEngine.Gonbest.MagicCube.PathUtils;
using CoroutinePool = UnityEngine.Gonbest.MagicCube.CoroutinePool;
using StringUtils = UnityEngine.Gonbest.MagicCube.StringUtils;
namespace Thousandto.Package
{
/// <summary>
/// 测试bundle读取方便确认打出来的bundle是否有效
/// </summary>
public class TestReadBundle
{
static AssetBundleRequest _request = null;
static AssetBundle _bundle = null;
[MenuItem("Test/LoadBundle(Runtime)")]
static void TestLoad()
{
string streamingAssetPath = Application.streamingAssetsPath;
string path = AssetDatabase.GetAssetPath(Selection.objects[0]).Replace("\\", "/");
string requestPath = path.Replace("Assets/StreamingAssets/GameAssets/Resources/", "").Replace(".unity3d", "");
LoadAssetBundle(requestPath);
}
[MenuItem("Test/LoadBundle(Editor)")]
static void TestLoad2()
{
string streamingAssetPath = Application.streamingAssetsPath;
string path = AssetDatabase.GetAssetPath(Selection.objects[0]).Replace("\\", "/");
var bundle = AssetBundle.LoadFromFile(path);
var assetNames = bundle.GetAllAssetNames();
UnityEngine.Object obj = null;
for(int i = 0; i < assetNames.Length; ++i)
{
UnityEngine.Debug.Log(assetNames[i]);
//obj = bundle.LoadAsset(assetNames[i]);
}
var assetName = Path.GetFileNameWithoutExtension(path);
if (path.IndexOf("Prefab/") >= 0 || path.IndexOf("VFX/") >= 0)
{
assetName += "_ScriptableObject";
}
UnityEngine.Debug.Log("AssetName:" + assetName);
obj = bundle.LoadAsset(assetName);
bundle.Unload(false);
GameObject.Instantiate(obj);
GameObject.DestroyImmediate(obj, false);
}
[MenuItem("Test/ResetLoadBundle")]
static void ResetTestLoad()
{
PathUtils.Initialize(false, 0);
}
[MenuItem("Test/清空游戏内已经加载过的资源的缓存数据")]
static void ClearAllCache()
{
try
{
ResourcesEx.ClearActionQueue();
Code.Center.GameCenter.TextureManager.Sweep();
}
catch(System.Exception ex)
{
UnityEngine.Debug.LogException(ex);
}
}
public static void LoadAssetBundle(string requestPath)
{
PathUtils.Initialize(true, 0);
ResourcesEx.LoadAsync(requestPath, AssetTypeCode.None,
(retObject, retBundle, err) =>
{
if (retBundle != null)
{
var assetBundle = retBundle;
var names = assetBundle.GetAllAssetNames();
string pathInBundle = "";
for (int i = 0; i < names.Length; ++i)
{
pathInBundle = names[i].ToUpper();
UnityEngine.Debug.Log(pathInBundle);
}
_request = assetBundle.LoadAssetAsync(pathInBundle, typeof(UnityEngine.Object));
_bundle = assetBundle;
EditorApplication.update += Update;
}
else
{
UnityEngine.Debug.LogError("Load bundel fail: " + requestPath);
}
}, AsyncActionType.LoadObject);
}
public static void Update()
{
if (_request == null || !_request.isDone)
return;
EditorApplication.update -= Update;
var asset = _request.asset;
var name = asset.name;
UnityEngine.Debug.Log("LoadAsync asset name: " + name);
if(_bundle != null)
{
var names = _bundle.GetAllAssetNames();
string pathInBundle = "";
for (int i = 0; i < names.Length; ++i)
{
pathInBundle = names[i].ToUpper();
UnityEngine.Debug.Log(pathInBundle);
}
var obje = _bundle.LoadAsset(pathInBundle);
var tempGO = obje;
if (obje is Launcher.ExternalLibs.PrefabAssetData)
{
var _assetData = new PrefabAssetDataProxy(obje);
tempGO = _assetData.ToPrefabGo();
GameObject ins2 = GameObject.Instantiate(tempGO) as GameObject;
}
//_bundle.Unload(false);
}
}
[MenuItem("Test/TestLoadMapFile")]
public static void TestParseMapFile()
{
string mapFilePath = AssetDatabase.GetAssetPath(Selection.objects[0]);
MapFileManage manage = new MapFileManage();
manage.parseMapFile(mapFilePath, "", "");
}
[MenuItem("Test/TestJson")]
public static void TestJson()
{
JSON.Parse("[{\"headers\":{\"sign\":\"AccountLoginBefore\",\"area\":\"China\",\"gameID\":\"185\"},\"body\":\"11~@185~@China~@yumo~@1.3.0~@null~@92c55bcdda09fe2055fc89f78af269b6~@90168f82-85de-480b-a45f-942d2884b923~@{\\\"errorCode\\\":1,\\\"errorInfo\\\":\\\"登陆失败,验证不通过 code=1\\\"}~@1502288728731~@1502288731577\"}]");
}
class MapFileManage
{
string _TAG = "MapFileManage.cs ";
List<MapFileData> _mapFileDataList = new List<MapFileData>();
string _saveDir;
public void setSaveDir(string saveDir)
{
_saveDir = saveDir;
}
public List<MapFileData> GetMapFileDataList()
{
return _mapFileDataList;
}
public int parseMapFile(string mapFile, string resUrl, string saveDir)
{
_saveDir = saveDir;
UnityEngine.Debug.LogError(_TAG + "parseMapFile(string mapFile, string resUrl):" + mapFile + "," + resUrl);
int ret = 1;
List<MapFileData> mapFileDataList = _mapFileDataList;
FileStream mapFileStream = null;
try
{
mapFileStream = new FileStream(mapFile, FileMode.Open);
long filePosition = 0;
long mapFileSize = mapFileStream.Length;
while (mapFileSize > 0 && filePosition != mapFileSize)
{
if (filePosition >= mapFileSize)
{
UnityEngine.Debug.LogError("解析出错了");
return ret;
}
MapFileData mapFileData = new MapFileData();
mapFileData.Begin = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
if (mapFileData.Begin == -1)
{
UnityEngine.Debug.LogError("解析map文件出现异常,请检查: " + mapFile);
return ret;
}
mapFileData.End = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
mapFileData.DirLen = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
mapFileData.NameLen = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
mapFileData.Md5Len = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
mapFileData.FileSize = parseInt(read(mapFileStream, 10, filePosition, out filePosition));
mapFileData.Dir = read(mapFileStream, mapFileData.DirLen, filePosition, out filePosition);
mapFileData.Name = read(mapFileStream, mapFileData.NameLen, filePosition, out filePosition);
mapFileData.Md5 = read(mapFileStream, mapFileData.Md5Len, filePosition, out filePosition);
mapFileData.ResUrl = resUrl;
mapFileData.SaveDir = _saveDir;
mapFileDataList.Add(mapFileData);
}
}
catch (System.Exception ex)
{
UnityEngine.Debug.LogError(_TAG + ex.Message + "\n" + ex.StackTrace);
}
finally
{
if (mapFileStream != null)
{
mapFileStream.Close();
}
}
return ret;
}
private int parseInt(string intStr)
{
int ret = 0;
if (!int.TryParse(intStr, out ret))
{
return -1;
}
return ret;
}
private string read(FileStream mapFileStream, int readLen, long position, out long filePosition)
{
Byte[] beginBuf = new Byte[readLen];
int readNum = mapFileStream.Read(beginBuf, 0, readLen);
filePosition = position + readLen;
if (readNum <= 0)
{
return null;
}
string retStr = System.Text.Encoding.Default.GetString(beginBuf);
return retStr;
}
}
public class MapFileData
{
int _begin;
public int Begin
{
get { return _begin; }
set { _begin = value; }
}
int _end;
public int End
{
get { return _end; }
set { _end = value; }
}
int _dirLen;
public int DirLen
{
get { return _dirLen; }
set { _dirLen = value; }
}
int _nameLen;
public int NameLen
{
get { return _nameLen; }
set { _nameLen = value; }
}
int _md5Len;
public int Md5Len
{
get { return _md5Len; }
set { _md5Len = value; }
}
int _fileSize;
public int FileSize
{
get { return _fileSize; }
set { _fileSize = value; }
}
string _dir;
public string Dir
{
get { return _dir; }
set { _dir = value; }
}
string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
string _md5;
public string Md5
{
get { return _md5; }
set { _md5 = value; }
}
string _resUrl;
public string ResUrl
{
get { return _resUrl; }
set { _resUrl = value; }
}
string _saveDir;
public string SaveDir
{
get { return _saveDir; }
set { _saveDir = value; }
}
public string GetTempFullPath()
{
return FullPath + ".bak";
}
internal object ArgObj = null;
internal Thousandto.Update.Delegate.UpdateAction<string, int, object> DownloadCallBack = null;
internal bool Downloaded = false;
internal bool Downloading = false;
internal string FullPath = null;
}
}
}