zip压缩加载测试

This commit is contained in:
2025-05-23 18:26:47 +08:00
parent ada423ac91
commit cbd48e8411
147 changed files with 7855 additions and 6 deletions

View File

@@ -0,0 +1,66 @@
using System;
using UnityEngine;
namespace Stary.Evo
{
public static class VectorExtension {
public static Vector3Ctor GetVector3Ctor(this Vector3 vector)
{
return new Vector3Ctor(vector);
}
public static Vector3 SetVector3Ctor(this Vector3Ctor vector3Ctor)
{
return new Vector3(vector3Ctor.x, vector3Ctor.y, vector3Ctor.z);
}
public static Vector2Ctor GetVector2Ctor( this Vector2 vector)
{
return new Vector2Ctor(vector);
}
public static Vector2 SetVector2Data(this Vector2Ctor vector3Ctor)
{
return new Vector2(vector3Ctor.x, vector3Ctor.y);
}
}
[Serializable]
public class Vector3Ctor
{
public float x;
public float y;
public float z;
public Vector3Ctor()
{
}
public Vector3Ctor(Vector3 vector)
{
x = vector.x;
y = vector.y;
z = vector.z;
}
public Vector3Ctor(float x, float y, float z)
{
this.x = x;
this.y = y;
this.z = z;
}
}
[Serializable]
public class Vector2Ctor
{
public float x;
public float y;
public Vector2Ctor(Vector2 vector)
{
x = vector.x;
y = vector.y;
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1077acf7c628ea24586d2c243ab718b4
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,90 @@
using System;
using Rokid.UXR.Module;
using Stary.Evo;
using UnityEngine;
using UnityEngine.Android;
using ModuleManager = Rokid.UXR.Module.ModuleManager;
public class VoiceSwitchingScene : MonoBehaviour
{
private String[] _sceneNames = new string[]
{
"打开第一个场景",
"打开第二个场景",
"打开第三个场景",
"打开第四个场景",
"打开第五个场景",
"打开第六个场景",
"打开第七个场景",
"打开第八个场景",
"打开第九个场景",
"打开第十个场景",
"打开第十一个场景",
"打开第十二个场景",
"打开第十三个场景",
"打开第十四个场景",
"打开第十五个场景",
"打开第十六个场景",
"打开第十七个场景",
"打开第十八个场景",
"打开第十九个场景",
"打开第二十个场景",
};
private String[] _sceneNamesSpell = new string[]
{
"da kai di yi ge chang jing",
"da kai di er ge chang jing",
"da kai di san ge chang jing",
"da kai di si ge chang jing",
"da kai di wu ge chang jing",
"da kai di liu ge chang jing",
"da kai di qi ge chang jing",
"da kai di ba ge chang jing",
"da kai di jiu ge chang jing",
"da kai di shi ge chang jing",
"da kai di shi yi ge chang jing",
"da kai di shi er ge chang jing",
"da kai di shi san ge chang jing",
"da kai di shi si ge chang jing",
"da kai di shi wu ge chang jing",
"da kai di shi liu ge chang jing",
"da kai di shi qi ge chang jing",
"da kai di shi ba ge chang jing",
"da kai di shi jiu ge chang jing",
"da kai di shi er shi ge chang jing",
};
private HybridClREntrance hybridClREntrance;
private MainDomainAll mainDomainAll;
// Start is called before the first frame update
void Start()
{
hybridClREntrance = GetComponent<HybridClREntrance>();
if (!Permission.HasUserAuthorizedPermission("android.permission.RECORD_AUDIO"))
{
Permission.RequestUserPermission("android.permission.RECORD_AUDIO");
}
ModuleManager.Instance.RegistModule("com.rokid.voicecommand.VoiceCommandHelper", false);
OfflineVoiceModule.Instance.ChangeVoiceCommandLanguage(LANGUAGE.CHINESE);
mainDomainAll = Resources.Load<MainDomainAll>("MainDomainAll");
for (int i = 0; i < mainDomainAll.domainAll.Length; i++)
{
if(mainDomainAll.domainAll[i].isVideo)
OfflineVoiceModule.Instance.AddInstruct(LANGUAGE.CHINESE, _sceneNames[i], _sceneNamesSpell[i], this.gameObject.name, "OnReceive");
}
OfflineVoiceModule.Instance.Commit();
}
void OnReceive(string msg)
{
int index = Array.IndexOf(_sceneNames, msg);
if (index != -1)
{
hybridClREntrance.OpenDomain(mainDomainAll.domainAll[index].domainName , OpenDomainType.VIOICE);
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 97f6e15196934254c94bd3de1f798b77
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
namespace Stary.Evo
{
public class ZipTool
{
// 新增:带进度回调的下载解压方法
public static async UniTask<string[]> DownloadAndUnzipAsync(string url, string extractPath,
Action<float> downloadProgress = null, Action<float> unzipProgress = null)
{
string tempPath = Path.Combine(Application.persistentDataPath, "temp.zip");
try
{
// 下载ZIP文件
using( UnityWebRequest request =WebRequester(url))
{
request.downloadHandler = new DownloadHandlerFile(tempPath);
var operation = request.SendWebRequest();
while (!operation.isDone)
{
downloadProgress?.Invoke(request.downloadProgress);
await UniTask.Yield();
}
if (request.result != UnityWebRequest.Result.Success)
{
throw new Exception($"下载失败:{request.error}");
}
}
// 解压下载的文件
return await UnzipAsync(tempPath, extractPath, unzipProgress);
}
finally
{
// 清理临时文件
if (File.Exists(tempPath))
{
File.Delete(tempPath);
}
}
}
// 修改:添加进度回调参数
public static async UniTask<string[]> UnzipAsync(string zipPath, string extractPath,
Action<float> progressCallback = null)
{
try
{
List<string> pathList = new List<string>();
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
{
float totalEntries = archive.Entries.Count;
float processed = 0;
foreach (ZipArchiveEntry entry in archive.Entries)
{
string filePath = Path.Combine(extractPath, entry.FullName);
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
if (!string.IsNullOrEmpty(entry.Name))
{
using (Stream inputStream = entry.Open())
using (FileStream outputStream = File.Create(filePath))
{
await inputStream.CopyToAsync(outputStream);
pathList.Add(outputStream.Name);
}
}
processed++;
float progress = processed / totalEntries;
progressCallback?.Invoke(progress);
Debug.Log($"解压进度: {progress:P0}");
}
}
Debug.Log($"解压完成: {extractPath}");
return pathList.ToArray();
}
catch (Exception ex)
{
Debug.LogError($"解压失败: {ex.Message}");
throw;
}
}
/// <summary>
/// 自定义网络请求器需要登录
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private static UnityWebRequest WebRequester(string url)
{
var request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbGET);
var authorization = GetAuthorization(AppConfig.USERNAME, AppConfig.PASSWORD);
request.SetRequestHeader("AUTHORIZATION", authorization);
return request;
}
private static string GetAuthorization(string userName, string password)
{
string auth = userName + ":" + password;
var bytes = System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(auth);
return "Basic " + System.Convert.ToBase64String(bytes);
}
}
}

View File

@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2f5ebd73225744188b38cf307e565ff2
timeCreated: 1747988495