【m】框架大更新

This commit is contained in:
2025-10-31 11:18:23 +08:00
parent ae6e7c804b
commit 8e1d52ddbf
1883 changed files with 213934 additions and 640 deletions
@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 07cb7fd0e03cab84183956dc06637b29
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,208 @@
using DG.Tweening;
using Stary.Evo;
using UnityEngine;
using UnityEngine.UI;
public class DeviceXEventHandler : MonoBehaviour
{
public static DeviceXEventHandler Global;
public bool XBackOrReturn = false;
private float pressStartTime;
private bool isPressing = false;
public HierarchyType hierarchyType;
// 在类中添加计时器和计数器变量
private float _lastJoystickButton2PressTime = 0f;
private int _joystickButton2PressCount = 0;
private const float DOUBLE_PRESS_TIME_THRESHOLD = 2f; // 2秒时间阈值
/// <summary>
/// 确定面板的CanvasGroup组件
/// </summary>
private CanvasGroup _confirmCGP;
/// <summary>
/// 退出面板的CanvasGroup组件
/// </summary>
private CanvasGroup _exitTimeCGP;
private Text _exitTimeText;
private GameObject exitPanelAni;
private void Awake()
{
if (Global == null)
{
Global = this;
}
else
{
Destroy(this);
return;
}
var deviceXEventPanelHandle = Resources.Load<GameObject>("DeviceXEventPanel");
if (deviceXEventPanelHandle)
{
var deviceXEventPanel = Instantiate(deviceXEventPanelHandle);
_confirmCGP = deviceXEventPanel.GetComponent<CanvasGroup>();
_confirmCGP.alpha = 0f;
}
var exitPanelHandle = Resources.Load<GameObject>("ExitTimePanel");
if (exitPanelHandle)
{
var exitPanel = Instantiate(exitPanelHandle);
_exitTimeCGP = exitPanel.GetComponent<CanvasGroup>();
_exitTimeText = exitPanel.GetComponentInChildren<Text>();
_exitTimeCGP.alpha = 0f;
exitPanelAni = _exitTimeCGP.GetComponentInChildren<Animator>().gameObject;
}
}
void Start()
{
StringEventSystem.Global.Register<bool>("X_Button", SetXbutton);
}
void OnDestroy()
{
StringEventSystem.Global.UnRegister<bool>("X_Button", SetXbutton);
}
void SetXbutton(bool isActive)
{
XBackOrReturn = isActive;
}
void Update()
{
if (XBackOrReturn)
{
OnJoystickButton2DoubleUpdate(KeyCode.JoystickButton2);
OnJoystickButton2DoubleUpdate(KeyCode.X);
}
else
{
OnJoystickButton2ExitTimeUpdate(KeyCode.JoystickButton2);
OnJoystickButton2ExitTimeUpdate(KeyCode.X);
}
}
private void OnJoystickButton2ExitTimeUpdate(KeyCode keyCode)
{
if (Input.GetKeyDown(keyCode))
{
isPressing = true;
_exitTimeCGP.alpha = 1;
_exitTimeText.text = "5";
exitPanelAni.SetActive(true);
pressStartTime = Time.time;
}
if (isPressing)
{
float time = Time.time - pressStartTime;
_exitTimeText.text = (5 - (int)time).ToString();
if (time >= 5f)
{
Debug.Log("UnityEvo:程序已退出!!");
Application.Quit();
}
}
if (Input.GetKeyUp(keyCode))
{
isPressing = false;
_exitTimeText.text = "5";
_exitTimeCGP.alpha = 0;
exitPanelAni.SetActive(false);
}
}
private void OnJoystickButton2DoubleUpdate(KeyCode keyCode)
{
// ... existing code ...
// JoystickButton2 双击检测
if (Input.GetKeyDown(keyCode))
{
float currentTime = Time.time;
// 如果是第一次按下或者在时间阈值内再次按下
if (_joystickButton2PressCount == 0 ||
(currentTime - _lastJoystickButton2PressTime) <= DOUBLE_PRESS_TIME_THRESHOLD)
{
_joystickButton2PressCount++;
_lastJoystickButton2PressTime = currentTime;
// 如果达到一次按下,执行单击逻辑
if (_joystickButton2PressCount == 1)
{
_confirmCGP.alpha = 1f;
_confirmCGP.DOFade(0f, 2f).OnKill(() => { _confirmCGP.alpha = 0; });
}
// 如果达到两次按下,执行双击逻辑
if (_joystickButton2PressCount >= 2)
{
_confirmCGP.DOKill();
OnJoystickButton2DoublePress();
_joystickButton2PressCount = 0; // 重置计数器
}
}
else
{
// 超过时间阈值,重置计数器
_joystickButton2PressCount = 1;
_lastJoystickButton2PressTime = currentTime;
}
}
// 检查是否超过时间阈值需要重置计数器
if (_joystickButton2PressCount > 0 &&
(Time.time - _lastJoystickButton2PressTime) > DOUBLE_PRESS_TIME_THRESHOLD)
{
_confirmCGP.DOKill();
_joystickButton2PressCount = 0;
}
}
// 双击事件处理方法
private void OnJoystickButton2DoublePress()
{
// 在这里执行双击后的逻辑
Debug.Log("JoystickButton2 双击事件触发!");
switch (hierarchyType)
{
case HierarchyType.Domain:
// 域层级双击逻辑
break;
case HierarchyType.ScenePanel:
// 场景面板层级双击逻辑
StringEventSystem.Global.Send("Rollback");
break;
case HierarchyType.SceneActive:
// 场景激活层级双击逻辑
StringEventSystem.Global.Send("UnloadCurrentScene");
break;
}
}
public enum HierarchyType
{
/// <summary>
/// 域层级
/// </summary>
Domain,
/// <summary>
/// 场景面板层级
/// </summary>
ScenePanel,
/// <summary>
/// 场景激活层级
/// </summary>
SceneActive
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c5d7e118e7b1517428f93ec97a4661b9
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 754b4f6110f9432b97f91b6acc4251e7
timeCreated: 1761544409
@@ -0,0 +1,186 @@
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Assertions;
using YooAsset;
namespace Stary.Evo
{
public class ArtResEditorSimulateState : AbstractFSMIStateAsync
{
public ArtResEditorSimulateState(IFsmSystemAsync system) : base(system)
{
}
public override async UniTask OnEnterAsync()
{
Debug.Log("UnityEvo:开始资源更新...");
// //初始化读取资源配置表
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
// 请求资源版本
var requetVersionOp = package.RequestPackageVersionAsync();
await requetVersionOp;
string packageVersion = "";
if (requetVersionOp.Status == EOperationStatus.Succeed)
{
//更新成功
packageVersion = requetVersionOp.PackageVersion;
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION", packageVersion);
Debug.Log($"UnityEvo:获取资源版本 Version : 【{packageVersion}】");
Debug.Log($"UnityEvo:开始加载服务器资源...");
}
else
{
Debug.LogError($"UnityEvo:获取资源版本失败: 【{requetVersionOp.Error}】");
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
return;
}
// 更新资源清单
var updateManifestOp = package.UpdatePackageManifestAsync(packageVersion);
await updateManifestOp;
if (updateManifestOp.Status == EOperationStatus.Succeed)
{
//更新成功
Debug.Log($"UnityEvo:更新资源清单 updateManifest : 【成功】");
}
else
{
//更新失败
Debug.LogError($"UnityEvo:更新资源清单失败: 【{updateManifestOp.Error}】");
}
//4.下载补丁包
await Download();
//加载热更配置文件
var loadArtSceneDataOp = package.LoadAssetAsync<ArtSceneData>("Config_ArtSceneData");
await loadArtSceneDataOp;
ArtSceneData artSceneData = null;
if (loadArtSceneDataOp.Status == EOperationStatus.Succeed)
{
//更新成功
Debug.Log($"UnityEvo:加载热更配置文件 ArtSceneData : 【成功】");
artSceneData = loadArtSceneDataOp.AssetObject as ArtSceneData;
}
else
{
Debug.LogError($"UnityEvo:加载热更配置文件 ArtSceneData : 【失败】");
}
if (artSceneData == null)
{
Debug.LogError($"UnityEvo:【{package.PackageName}】加载ArtSceneData为空,无法继续执行后续流程,请检查!!!");
}
}
public override UniTask OnEnterAsync<T>(T param)
{
return UniTask.CompletedTask;
}
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
{
return UniTask.CompletedTask;
}
public override void OnUpdate()
{
base.OnUpdate();
}
public override async UniTask OnExitAsync()
{
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(AppConfig.PackageDomainName);
AppConfig.PackageDomainName = "";
}
#region
public async UniTask Download()
{
int downloadingMaxNum = 10;
int failedTryAgain = 3;
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
//没有需要下载的资源
if (downloader.TotalDownloadCount == 0)
{
Debug.Log("UnityEvo:没有需要下载的资源,跳过更新");
return;
}
//需要下载的文件总数和总大小
int totalDownloadCount = downloader.TotalDownloadCount;
long totalDownloadBytes = downloader.TotalDownloadBytes;
Debug.Log($"UnityEvo:需要下载的资源的个数【{totalDownloadCount}】,需要下载的资源的总大小{totalDownloadBytes / 1024} MB");
//===================================适应新版本YooAsset插件的修改===================================
//注册回调方法
downloader.DownloadErrorCallback = OnDownloadErrorFunction;
downloader.DownloadUpdateCallback = OnDownloadProgressUpdateFunction;
downloader.DownloadFinishCallback = OnDownloadOverFunction;
downloader.DownloadFileBeginCallback = OnStartDownloadFileFunction;
//===================================适应新版本YooAsset插件的修改===================================
//开启下载
downloader.BeginDownload();
await downloader;
//检测下载结果
if (downloader.Status == EOperationStatus.Succeed)
{
//下载成功
Debug.Log("UnityEvo:资源更新完成");
}
else
{
//下载失败
Debug.Log("UnityEvo:资源更新失败");
}
}
//===================================适应新版本YooAsset插件的修改===================================
/// <summary>
/// 开始下载
/// </summary>
private void OnStartDownloadFileFunction(DownloadFileData downloadFileData)
{
Debug.Log(
$"UnityEvo:开始下载:文件名:{downloadFileData.FileName},文件大小:{downloadFileData.FileSize / 1024f / 1024f} MB");
}
/// <summary>
/// 下载完成
/// </summary>
private void OnDownloadOverFunction(DownloaderFinishData downloaderFinishData)
{
Debug.Log("UnityEvo:下载" + (downloaderFinishData.Succeed ? "成功" : "失败"));
}
/// <summary>
/// 更新中
/// </summary>
private void OnDownloadProgressUpdateFunction(DownloadUpdateData downloadUpdateData)
{
Debug.Log(
$"UnityEvo:文件总数:{downloadUpdateData.TotalDownloadCount},已下载文件数:{downloadUpdateData.CurrentDownloadCount},下载总大小:{downloadUpdateData.TotalDownloadBytes / 1024f / 1024f} MB,已下载大小{downloadUpdateData.CurrentDownloadBytes / 1024f / 1024f} MB");
}
/// <summary>
/// 下载出错
/// </summary>
/// <param name="errorData"></param>
private void OnDownloadErrorFunction(DownloadErrorData errorData)
{
Debug.Log($"UnityEvo:下载出错:包名:{errorData.PackageName} 文件名:{errorData.FileName},错误信息:{errorData.ErrorInfo}");
}
//===================================适应新版本YooAsset插件的修改===================================
#endregion
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 3aea4d75ee654390b41c6cdd1b22a9ba
timeCreated: 1761797700
@@ -0,0 +1,147 @@
using System;
using Cysharp.Threading.Tasks;
using UnityEngine;
using UnityEngine.Assertions;
using YooAsset;
namespace Stary.Evo
{
public class ArtResUpdateLocalState : AbstractFSMIStateAsync
{
public ArtResUpdateLocalState(IFsmSystemAsync system) : base(system)
{
}
public override async UniTask OnEnterAsync()
{
//初始化读取资源配置表
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
//更新失败
Debug.Log($"UnityEvo:切换为加载本地缓存资源...");
string packageVersion = "";
// if (package.PackageName.Equals("Main"))
// {
// var operation = package.RequestPackageVersionAsync();
// await operation;
// if (operation.Status == EOperationStatus.Succeed)
// {
// //更新成功
// packageVersion = operation.PackageVersion;
// Debug.Log($"Unity:【Main】Request package Version : {packageVersion}");
// }
// else
// {
// //更新失败
// Debug.LogError("Unity:【Main】" + operation.Error);
// }
// }
//else
{
// 获取上次成功记录的版本
packageVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION", string.Empty);
if (string.IsNullOrEmpty(packageVersion))
{
Debug.Log($"UnityEvo:没有找到本地版本记录,需要更新资源!");
return;
}
}
Debug.Log($"UnityEvo:获取资源版本 Version : 【{packageVersion}】");
Debug.Log($"UnityEvo:开始加载本地资源...");
// Assert.AreEqual(EOperationStatus.Succeed, requetVersionOp.Status);
// 加载本地缓存的资源清单文件
var updateManifestOp = package.UpdatePackageManifestAsync(packageVersion);
await updateManifestOp;
if (updateManifestOp.Status == EOperationStatus.Succeed)
{
//更新成功
Debug.Log($"UnityEvo:更新本地资源清单 updateManifest : 【成功】");
}
else
{
//更新失败
Debug.LogError($"UnityEvo:加载本地资源清单文件失败,需要更新资源!: 【{updateManifestOp.Error}】");
return;
}
Assert.AreEqual(EOperationStatus.Succeed, updateManifestOp.Status);
//4.检测补丁包
await Download();
//加载热更配置文件
var loadArtSceneDataOp = package.LoadAssetAsync<ArtSceneData>("Config_ArtSceneData");
await loadArtSceneDataOp;
ArtSceneData artSceneData = null;
if (loadArtSceneDataOp.Status == EOperationStatus.Succeed)
{
//更新成功
Debug.Log($"UnityEvo:加载热更配置文件 ArtSceneData : 【成功】");
artSceneData = loadArtSceneDataOp.AssetObject as ArtSceneData;
}
else
{
Debug.LogError($"UnityEvo:加载热更配置文件 ArtSceneData : 【失败】");
}
if (artSceneData == null)
{
Debug.LogError($"UnityEvo:【{package.PackageName}】加载ArtSceneData为空,无法继续执行后续流程,请检查!!!");
}
}
public override UniTask OnEnterAsync<T>(T param)
{
return UniTask.CompletedTask;
}
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
{
return UniTask.CompletedTask;
}
public override void OnUpdate()
{
base.OnUpdate();
}
public override async UniTask OnExitAsync()
{
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(AppConfig.PackageDomainName);
AppConfig.PackageDomainName = "";
}
#region
public async UniTask Download()
{
int downloadingMaxNum = 1;
int failedTryAgain = 1;
var package = YooAssets.GetPackage(AppConfig.PackageDomainName);
var downloader = package.CreateResourceDownloader(downloadingMaxNum, failedTryAgain);
// 在正常开始游戏之前,还需要验证本地清单内容的完整性。
if (downloader.TotalDownloadCount > 0)
{
Debug.Log("UnityEvo:资源内容本地并不完整,需要更新资源!");
return;
}
}
#endregion
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 427c14c44ce64cccaaa9a396b085c573
timeCreated: 1761544429
@@ -0,0 +1,234 @@
using System;
using System.IO;
using Cysharp.Threading.Tasks;
using Main;
using Newtonsoft.Json;
using UnityEditor;
using UnityEngine;
using UnityEngine.Assertions;
using YooAsset;
using Object = UnityEngine.Object;
namespace Stary.Evo
{
public class ArtResStartState : AbstractFSMIStateAsync
{
public ArtResStartState(IFsmSystemAsync system) : base(system)
{
}
public override async UniTask OnEnterAsync()
{
Debug.Log("UnityEvo:启动开始资源初始化...");
//初始化读取资源配置表
HotfixMainResDomain hotfixMainResDomain = Resources.Load<HotfixMainResDomain>("HotfixMainResDomain");
if (hotfixMainResDomain != null)
{
AppConfig.IpConfig = hotfixMainResDomain.hotfixMainResDomainEntity.ipconfig;
AppConfig.UserName = hotfixMainResDomain.hotfixMainResDomainEntity.username;
AppConfig.PassWord = hotfixMainResDomain.hotfixMainResDomainEntity.password;
AppConfig.ProductName =Application.identifier;
AppConfig.MainDomainVersion = hotfixMainResDomain.hotfixMainResDomainEntity.mainDomainVersion;
}
Debug.Log($"UnityEvo:读取资源配置表成功...{AppConfig.IpConfig}{AppConfig.UserName}{AppConfig.PassWord}");
// 初始化资源系统
YooAssets.Initialize();
//自定义网络请求器
// 设置自定义请求委托
//YooAssets.SetDownloadSystemUnityWebRequest(NasWebRequester);
//初始化资源加载模块
// 增加包存在性检查
var package = YooAssets.TryGetPackage(AppConfig.PackageDomainName);
if (package == null)
{
Debug.LogWarning($"UnityEvo:资源包 {AppConfig.PackageDomainName} 不存在,正在尝试创建...");
package = YooAssets.CreatePackage(AppConfig.PackageDomainName);
}
YooAssets.SetDefaultPackage(package);
// 初始化资源包
#if EDITOR_SIMULATEMODE
await EDITOR_SIMULATEMODE(package);
//await FsmSystem.SetCurState(nameof(ResUpdateServerState));
await FsmSystem.SetCurState(nameof(ArtResEditorSimulateState));
#elif HOST_PLAYMODE
//登录
string url = AppConfig.IpConfig + "/Authentication/login";
bool isLogin = await WebRequestSystem.Login(url, AppConfig.UserName, AppConfig.PassWord);
if (isLogin)
await HOST_PLAYMODE(package);
else
await Chche_PLAYMODE(package);
await FsmSystem.SetCurState(nameof(ArtResUpdateLocalState));
#endif
}
public override UniTask OnEnterAsync<T>(T param)
{
return UniTask.CompletedTask;
}
public override UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
{
return UniTask.CompletedTask;
}
public override void OnUpdate()
{
base.OnUpdate();
}
public override UniTask OnExitAsync()
{
return UniTask.CompletedTask;
}
private async UniTask EDITOR_SIMULATEMODE(ResourcePackage package)
{
var initParams=YooAssetFileSystem.EditorSimulateInitializeParameter(package.PackageName);
var initialization = package.InitializeAsync(initParams);
await initialization;
if (initialization.Status == EOperationStatus.Succeed)
{
Assert.AreEqual(EOperationStatus.Succeed, initialization.Status);
Debug.Log("UnityEvo:资源包初始化成功!");
}
else
{
Debug.LogError($"UnityEvo:资源包初始化失败:{initialization.Error}");
}
//运行模拟文件系统
}
private async UniTask Chche_PLAYMODE(ResourcePackage package)
{
Debug.Log("UnityEvo:网络连接不通畅,切换缓存加载!");
var initParams=YooAssetFileSystem.HostInitializeParameter();
var initOperation = package.InitializeAsync(initParams);
await initOperation;
var operation = package.RequestPackageVersionAsync();
await operation;
if (operation.Status == EOperationStatus.Succeed)
{
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION", operation.PackageVersion);
Debug.Log("UnityEvo:从本地缓存中加载资源包,初始化获取版本号成功!");
}else
{
Debug.LogError($"UnityEvo:从本地缓存中加载资源包,初始化获取版本号失败!");
}
if (initOperation.Status == EOperationStatus.Succeed)
Debug.Log("UnityEvo:从本地缓存中资源包,初始化成功!");
else
Debug.LogError($"UnityEvo:从本地缓存中资源包,初始化失败:{initOperation.Error}");
}
public async UniTask HOST_PLAYMODE(ResourcePackage package)
{
// 新增平台判断代码
#if UNITY_EDITOR
BuildTarget buildTarget = UnityEditor.EditorUserBuildSettings.activeBuildTarget;
AppConfig.Platform = buildTarget.ToString();
#else
AppConfig.Platform = Application.platform.ToString();
#endif
Debug.Log($"目标平台标识: {AppConfig.Platform}");
// 请求资源版本
string url = $"{AppConfig.IpConfig}/ResDomain/GetResDomainByDomain";
var resDmainRequst = new ResDmainRequst()
{
ProductName = AppConfig.ProductName,
DomainName = AppConfig.PackageDomainName,
Platform = AppConfig.Platform,
};
//获取服务器版本
var resDmainMessageEntity = await WebRequestSystem.Post(url, JsonConvert.SerializeObject(resDmainRequst));
if (resDmainMessageEntity.code == 200)
{
ResDmainResponse resDmainResponse =
JsonConvert.DeserializeObject<ResDmainResponse>(resDmainMessageEntity.data.ToString());
//获取当前版本
var oldVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION");
//版本不一致,开始下载
if (resDmainResponse.PackageVersion != oldVersion)
{
await Download(resDmainResponse.DocumentFileId);
PlayerPrefs.SetString($"{AppConfig.PackageDomainName}_GAME_VERSION",
resDmainResponse.PackageVersion);
}
else //版本一致,加载缓存资源
{
Debug.Log($"UnityEvo:资源版本一致,自动跳过更新...");
}
}
else
{
Debug.LogError($"UnityEvo:获取资源版本失败: 【{resDmainMessageEntity.message}】");
}
var initParams=YooAssetFileSystem.HostInitializeParameter();
// initParameters.CacheFileSystemParameters = cacheFileSystemParams;
var initOperation = package.InitializeAsync(initParams);
await initOperation;
if (initOperation.Status == EOperationStatus.Succeed)
Debug.Log("UnityEvo:从远程加载资源包,初始化成功!");
else
Debug.LogError($"UnityEvo:从远程加载资源包,初始化失败:{initOperation.Error}");
}
public async UniTask Download(string fileId)
{
// 在任意MonoBehaviour或DomainBase派生类中
string loadPath = Path.Combine(Application.temporaryCachePath, "DownloadedContent",
AppConfig.PackageDomainName);
//string loadPath = $"{Application.persistentDataPath}/DownloadedContent/{AppConfig.PackageDomainName}";
if (Directory.Exists(loadPath))
{
Directory.Delete(loadPath, true);
// 等一帧,让系统真正释放句柄
await UniTask.DelayFrame(1);
}
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
if (loadSystem.ProgressBarPanel == null)
{
loadSystem.ProgressBarPanel =Object.Instantiate(Resources.Load<GameObject>("ProgressBarPanel"),
Camera.main.transform).GetOrAddComponent<ProgressBarPanel>();
}
await ZipTool.DownloadAndUnzipAsync(fileId, loadPath, DownLoadProgress, UnzipProgress);
}
private void DownLoadProgress(float progress)
{
Debug.Log($"下载进度:{progress:P0}");
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
loadSystem.ProgressBarPanel.SetProgressBarValue("下载中", progress);
}
private void UnzipProgress(float progress)
{
Debug.Log($"解压进度:{progress:P0}");
FsmLoadSystem loadSystem =FsmSystem as FsmLoadSystem;
loadSystem.ProgressBarPanel.SetProgressBarValue("解压中", progress);
}
}
}
@@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: d0b834dad2be4240ba3b6e3e77f38b1d
timeCreated: 1761544429
@@ -21,9 +21,9 @@ namespace Stary.Evo
/// <param name="param"></param>
public virtual void OnEnter(string param)
{
if ( HybridClREntrance.Global.domain =="Main" && !HybridClREntrance.Global.loadDomain.Equals("null"))
if (HybridClREntrance.Global.domain == "Main" && !HybridClREntrance.Global.loadDomain.Equals("null"))
{
HybridClREntrance.Global.OpenDomain(HybridClREntrance.Global.loadDomain,OpenDomainType.VIOICE);
HybridClREntrance.Global.OpenDomain(HybridClREntrance.Global.loadDomain, OpenDomainType.VIOICE);
//return;
}
}
@@ -34,22 +34,17 @@ namespace Stary.Evo
/// <param name="param"></param>
public virtual void OnExit()
{
}
public virtual Task OnEnterAsync(string param)
{
return Task.CompletedTask;
}
public virtual Task OnExitAsync()
public virtual Task OnExitAsync()
{
return Task.CompletedTask;
}
}
}
@@ -1,5 +1,8 @@
using Main;
using System;
using Cysharp.Threading.Tasks;
using Main;
using UnityEngine;
using YooAsset;
namespace Stary.Evo
{
@@ -31,5 +34,28 @@ namespace Stary.Evo
{
return this.transformCtor;
}
// 强制卸载所有资源包,该方法请在合适的时机调用。
// 注意:Package在销毁的时候也会自动调用该方法。
public async UniTask ForceUnloadAllAssets(string packageName)
{
var package = YooAssets.TryGetPackage(packageName);
if (package != null)
{
var operation = package.UnloadAllAssetsAsync();
await operation;
await package.DestroyAsync();
YooAssets.RemovePackage(packageName);
Resources.UnloadUnusedAssets();
GC.Collect();
GC.WaitForPendingFinalizers();
Debug.Log($"UnityEvo:{packageName} 资源包已卸载...");
}
else
{
Debug.LogWarning($"UnityEvo:{packageName} 资源包不存在,请检查是否已经卸载还是卸载异常...");
}
}
}
}
@@ -175,36 +175,14 @@ namespace Stary.Evo
{
GameObject.Destroy(domainBase.gameObject);
await ForceUnloadAllAssets(domainBase.DomainName);
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(domainBase.DomainName);
}
if (loadResType == DomainConfig.LoadResType.Scene)
{
await SceneManager.UnloadSceneAsync(_sceneName);
}
AppConfig.PackageDomainName = "";
}
}
// 强制卸载所有资源包,该方法请在合适的时机调用。
// 注意:Package在销毁的时候也会自动调用该方法。
private async UniTask ForceUnloadAllAssets(string packageName)
{
var package = YooAssets.TryGetPackage(packageName);
if (package != null)
{
var operation = package.UnloadAllAssetsAsync();
await operation;
await package.DestroyAsync();
YooAssets.RemovePackage(packageName);
Resources.UnloadUnusedAssets();
GC.Collect();
GC.WaitForPendingFinalizers();
Debug.Log($"UnityEvo:{packageName} 资源包已卸载...");
}
else
{
Debug.LogWarning($"UnityEvo:{packageName} 资源包不存在,请检查是否已经卸载还是卸载异常...");
}
}
}
@@ -5,9 +5,9 @@ using YooAsset;
namespace Stary.Evo
{
public class ResUpdateServerState : AbstractFSMIStateAsync
public class ResEditorSimulateState : AbstractFSMIStateAsync
{
public ResUpdateServerState(IFsmSystemAsync system) : base(system)
public ResEditorSimulateState(IFsmSystemAsync system) : base(system)
{
}
@@ -37,13 +37,6 @@ namespace Stary.Evo
Debug.Log($"UnityEvo:读取资源配置表成功...{AppConfig.IpConfig}{AppConfig.UserName}{AppConfig.PassWord}");
// 初始化资源系统
YooAssets.Initialize();
//自定义网络请求器
// 设置自定义请求委托
//YooAssets.SetDownloadSystemUnityWebRequest(NasWebRequester);
//初始化资源加载模块
// 增加包存在性检查
var package = YooAssets.TryGetPackage(AppConfig.PackageDomainName);
@@ -58,10 +51,10 @@ namespace Stary.Evo
// 初始化资源包
#if EDITOR_SIMULATEMODE
await EDITOR_SIMULATEMODE(package);
FsmSystem.SetCurState(nameof(ResUpdateServerState));
await FsmSystem.SetCurState(nameof(ResEditorSimulateState));
#elif OFFLINE_PLAYMODE
await OFFLINE_PLAYMODE(package);
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
await FsmSystem.SetCurState(nameof(ResUpdateLocalState));
#elif HOST_PLAYMODE
//登录
@@ -70,10 +63,10 @@ namespace Stary.Evo
if (isLogin)
await HOST_PLAYMODE(package);
else
await Chche_PLAYMODE(package);
await ChChe_PLAYMODE(package);
FsmSystem.SetCurState(nameof(ResUpdateLocalState));
await FsmSystem.SetCurState(nameof(ResUpdateLocalState));
#elif WEB_PLAYMODE
// IRemoteServices remoteServices = new RemoteServices(defaultHostServer, fallbackHostServer);
@@ -134,10 +127,10 @@ namespace Stary.Evo
Debug.LogError($"UnityEvo:资源包初始化失败:{initialization.Error}");
}
}
private async UniTask Chche_PLAYMODE(ResourcePackage package)
private async UniTask ChChe_PLAYMODE(ResourcePackage package)
{
Debug.Log("UnityEvo:网络连接不通畅,切换缓存加载!");
var initParams=YooAssetFileSystem.hostInitializeParameter();
var initParams=YooAssetFileSystem.HostInitializeParameter();
var initOperation = package.InitializeAsync(initParams);
await initOperation;
@@ -224,7 +217,7 @@ namespace Stary.Evo
Debug.LogError($"UnityEvo:获取资源版本失败: 【{resDmainMessageEntity.message}】");
}
var initParams=YooAssetFileSystem.hostInitializeParameter();
var initParams=YooAssetFileSystem.HostInitializeParameter();
// initParameters.CacheFileSystemParameters = cacheFileSystemParams;
var initOperation = package.InitializeAsync(initParams);
@@ -22,23 +22,23 @@ namespace Stary.Evo
Debug.Log($"UnityEvo:切换为加载本地缓存资源...");
string packageVersion = "";
if (package.PackageName.Equals("Main"))
{
var operation = package.RequestPackageVersionAsync();
await operation;
if (operation.Status == EOperationStatus.Succeed)
{
//更新成功
packageVersion = operation.PackageVersion;
Debug.Log($"Unity:【Main】Request package Version : {packageVersion}");
}
else
{
//更新失败
Debug.LogError("Unity:【Main】" + operation.Error);
}
}
else
// if (package.PackageName.Equals("Main"))
// {
// var operation = package.RequestPackageVersionAsync();
// await operation;
// if (operation.Status == EOperationStatus.Succeed)
// {
// //更新成功
// packageVersion = operation.PackageVersion;
// Debug.Log($"Unity:【Main】Request package Version : {packageVersion}");
// }
// else
// {
// //更新失败
// Debug.LogError("Unity:【Main】" + operation.Error);
// }
// }
// else
{
// 获取上次成功记录的版本
packageVersion = PlayerPrefs.GetString($"{AppConfig.PackageDomainName}_GAME_VERSION", string.Empty);
@@ -1,3 +1,4 @@
using System.Threading.Tasks;
using UnityEngine;
namespace Stary.Evo
@@ -5,9 +6,12 @@ namespace Stary.Evo
public class HybridClREntrance : MonoBehaviour
{
public static HybridClREntrance Global;
public StageType stage;
public string domain;
private FsmLoadSystem _fsmSystem;
private FsmLoadSystem _devLoadSystem;
private FsmLoadSystem _originalityLoadSystem;
/// <summary>
/// 即将加载的domain场景
@@ -27,13 +31,13 @@ namespace Stary.Evo
return;
}
_fsmSystem = new FsmLoadSystem();
_devLoadSystem = new FsmLoadSystem();
// 初始化日志
_fsmSystem.AddState(new ResStartState(_fsmSystem));
_fsmSystem.AddState(new ResUpdateServerState(_fsmSystem));
_fsmSystem.AddState(new ResUpdateLocalState(_fsmSystem));
_fsmSystem.AddState(new HotFixState(_fsmSystem));
_fsmSystem.AddState(new LoadResState(_fsmSystem));
_devLoadSystem.AddState(new ResStartState(_devLoadSystem));
_devLoadSystem.AddState(new ResEditorSimulateState(_devLoadSystem));
_devLoadSystem.AddState(new ResUpdateLocalState(_devLoadSystem));
_devLoadSystem.AddState(new HotFixState(_devLoadSystem));
_devLoadSystem.AddState(new LoadResState(_devLoadSystem));
//_fsmSystem.AddState(new LoadResMainState(_fsmSystem));
}
@@ -46,70 +50,99 @@ namespace Stary.Evo
// var immersalSDK = FindObjectOfType<ImmersalSDK>();
// immersalSDK.onPoseFound.Invoke();
#endif
if (stage == StageType.Developer)
{
AppConfig.PackageDomainName = domain;
}
else if (stage == StageType.Originality)
{
AppConfig.PackageDomainName = "Main";
}
AppConfig.PackageDomainName = domain;
_fsmSystem.SetCurState(nameof(ResStartState));
_devLoadSystem.SetCurState(nameof(ResStartState));
}
private void Update()
{
if (_fsmSystem.CurState != null)
_fsmSystem.CurState.OnUpdate();
if (_devLoadSystem.CurState != null)
_devLoadSystem.CurState.OnUpdate();
}
public void OpenDomain()
public async Task OpenDomain()
{
AppConfig.PackageDomainName = domain;
_fsmSystem.SetCurState(nameof(ResStartState));
if (stage == StageType.Developer)
{
await _devLoadSystem.SetCurState(nameof(ResStartState));
}
else if (stage == StageType.Originality)
{
if (_originalityLoadSystem == null)
{
_originalityLoadSystem = new FsmLoadSystem();
_originalityLoadSystem.AddState(new ArtResStartState(_originalityLoadSystem));
_originalityLoadSystem.AddState(new ArtResUpdateLocalState(_originalityLoadSystem));
_originalityLoadSystem.AddState(new ArtResEditorSimulateState(_originalityLoadSystem));
}
await _originalityLoadSystem.SetCurState(nameof(ArtResStartState));
}
}
public void OpenDomain(string domain, OpenDomainType openDomainType)
{
this.domain = domain;
_fsmSystem.SetOpenDomainType(openDomainType);
_devLoadSystem.SetOpenDomainType(openDomainType);
if (this.domain != AppConfig.PackageDomainName)
{
AppConfig.PackageDomainName = domain;
_fsmSystem.SetCurState(nameof(ResStartState));
_devLoadSystem.SetCurState(nameof(ResStartState));
}
else
{
Debug.Log($"domain:{domain} 已打开, 请勿重复打开");
}
}
public void OpenDomain(string domain, TransformCtor transformCtor)
{
this.domain = domain;
_fsmSystem.SetOpenDomainType(OpenDomainType.ImageTracked);
_fsmSystem.SetTransformCtor(transformCtor);
_devLoadSystem.SetOpenDomainType(OpenDomainType.ImageTracked);
_devLoadSystem.SetTransformCtor(transformCtor);
if (this.domain != AppConfig.PackageDomainName)
{
AppConfig.PackageDomainName = domain;
_fsmSystem.SetCurState(nameof(ResStartState));
_devLoadSystem.SetCurState(nameof(ResStartState));
}
else
{
Debug.Log($"domain:{domain} 已打开, 请勿重复打开");
}
}
public void OpenDomain(string domain, Transform transform)
{
this.domain = domain;
_fsmSystem.SetOpenDomainType(OpenDomainType.ImageTracked);
_fsmSystem.SetTransformCtor(transform);
_devLoadSystem.SetOpenDomainType(OpenDomainType.ImageTracked);
_devLoadSystem.SetTransformCtor(transform);
if (this.domain != AppConfig.PackageDomainName)
{
AppConfig.PackageDomainName = domain;
_fsmSystem.SetCurState(nameof(ResStartState));
_devLoadSystem.SetCurState(nameof(ResStartState));
}
else
{
Debug.Log($"domain:{domain} 已打开, 请勿重复打开");
}
}
public void CloseDomain()
{
_fsmSystem.SetCurState(nameof(DefaultStateAsync));
if (_devLoadSystem != null)
_devLoadSystem.SetCurState(nameof(DefaultStateAsync));
if (_originalityLoadSystem != null)
_originalityLoadSystem.SetCurState(nameof(DefaultStateAsync));
}
}
@@ -125,4 +158,17 @@ namespace Stary.Evo
VIOICE,
ImageTracked
}
public enum StageType
{
/// <summary>
/// 创意阶段
/// </summary>
Originality,
/// <summary>
/// 开发者阶段
/// </summary>
Developer,
}
}
@@ -21,13 +21,20 @@ namespace Stary.Evo.UIFarme
/// 绑定这个面板的实例
/// </summary>
void Initialize(GameObject panelGo);
/// <summary>
/// 绑定这个面板的实例
/// </summary>
Task InitializeAsync(GameObject panelGo);
/// <summary>
/// 初始化面板管理器
/// </summary>
/// <param name="panelManager"></param>
void Initialize(IPanelSystem sysytem);
/// <summary>
/// 初始化面板管理器
/// </summary>
/// <param name="panelManager"></param>
Task InitializeAsync(IPanelSystem sysytem);
/// <summary>
/// 虚方法,UI进入时执行的操作,只会执行一次
/// </summary>
@@ -117,17 +124,29 @@ namespace Stary.Evo.UIFarme
canvasGroup.alpha = 0f;
}
public virtual Task InitializeAsync(GameObject panelGo)
{
Initialize(panelGo);
return Task.CompletedTask;
}
public virtual void Initialize(IPanelSystem sysytem)
{
PanelSystem = sysytem;
}
public virtual Task InitializeAsync(IPanelSystem sysytem)
{
Initialize(sysytem);
return Task.CompletedTask;
}
public virtual void OnEnter(Action complete = null)
{
activePanel.SetActive(true);
canvasGroup.blocksRaycasts = true;
if (TweenType == UITweenType.Fade)
if (TweenType == UITweenType.None)
{
canvasGroup.alpha = 1f;
}
@@ -116,11 +116,11 @@ namespace Stary.Evo.UIFarme
{
nextPanel = new T();
nextPanel.UIName = panelName;
nextPanel.Initialize(this);
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel($"Prefabs_{prefabName}", packageName);
///生成面板后,进行初始化操作
nextPanel.Initialize(panelGo);
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(panelName, nextPanel);
}
else
@@ -160,19 +160,19 @@ namespace Stary.Evo.UIFarme
{
nextPanel = new T();
nextPanel.UIName = panelName;
nextPanel.Initialize(this);
await nextPanel.InitializeAsync(this);
nextPanel.SetPanelParent(parent);
GameObject panelGo = await nextPanel.CreatePanel($"Prefabs_{prefabName}", packageName);
///生成面板后,进行初始化操作
nextPanel.Initialize(panelGo);
await nextPanel.InitializeAsync(panelGo);
dicUI.Add(panelName, nextPanel);
}
else
{
for (int i = 0; i < stackPanel.Count; i++)
foreach (var panel in stackPanel)
{
if (queuePanel[i].GetType().Name == panelName)
if (panel.GetType().Name == panelName)
{
return;
}
@@ -180,7 +180,10 @@ namespace Stary.Evo.UIFarme
nextPanel = dicUI[panelName];
}
if(stackPanel.Count > 0)
{
stackPanel.Peek().OnExit();
}
stackPanel.Push(nextPanel);
nextPanel.OnEnter();
}
@@ -218,7 +221,7 @@ namespace Stary.Evo.UIFarme
if (stackPanel.Count > 0)
{
stackPanel.Peek().OnResume();
stackPanel.Peek().OnEnter();
}
}
@@ -12,7 +12,7 @@ namespace Stary.Evo
initParameters.BuildinFileSystemParameters = buildinFileSystemParams;
return initParameters;
}
public static InitializeParameters hostInitializeParameter()
public static InitializeParameters HostInitializeParameter()
{
var initParameters = new OfflinePlayModeParameters();
var buildinFileSystemParams = FileSystemParameters.CreateDefaultBuildinFileSystemParameters(null,
@@ -27,8 +27,11 @@ namespace Stary.Evo
var buildResult = EditorSimulateModeHelper.SimulateBuild(packageName);
var packageRoot = buildResult.PackageRootDirectory;
var editorFileSystemParameters = FileSystemParameters.CreateDefaultEditorFileSystemParameters(packageRoot);
// editorFileSystemParameters.AddParameter(FileSystemParametersDefine.VIRTUAL_DOWNLOAD_MODE, true);
// int speed = 1024 * 1024; //单位:字节
// editorFileSystemParameters.AddParameter(FileSystemParametersDefine.VIRTUAL_DOWNLOAD_SPEED, speed);
var initParams = new EditorSimulateModeParameters();
initParams.EditorFileSystemParameters = editorFileSystemParameters;
initParams.EditorFileSystemParameters = editorFileSystemParameters;
return initParams;
}
}
@@ -2,14 +2,15 @@
"name": "com.staryevo.tools.runtime",
"rootNamespace": "",
"references": [
"GUID:f51ebe6a0ceec4240a699833d6309b23",
"GUID:aa8669166ad4e984bb229dc22e7b1e02",
"GUID:d1a793c2b6959e04ea45b972eaa369c8",
"GUID:006be2ba6588a8b4989d3724bb01d8b7",
"GUID:e34a5702dd353724aa315fb8011f08c3",
"GUID:ff70fce64a3314305977bdf5610ed86b",
"GUID:ec45849e30ba03e4dab386099d8c697b",
"GUID:fad681b9bfe621d4fa07f4f69c311443"
"UniTask",
"com.audiocore.runtime",
"com.stary.evo.runtime",
"HybridCLR.Runtime",
"ImmersalSDK",
"Informationsave.runtime",
"DOTween.Modules",
"com.stary.buildoriginality.runtime",
"YooAsset"
],
"includePlatforms": [],
"excludePlatforms": [],