Files
plugin-library/Assets/00.StaryEvoTools/Runtime/HybridLoad/Fsm/ResStartState.cs

202 lines
7.5 KiB
C#
Raw Normal View History

2025-05-23 18:26:47 +08:00
using System;
using Cysharp.Threading.Tasks;
2026-01-07 18:20:13 +08:00
#if Immersal
using Immersal.AR;
#endif
using Stary.Evo;
using Stary.Evo.InformationSave;
2025-05-23 18:26:47 +08:00
using UnityEngine;
2026-01-07 18:20:13 +08:00
using UnityEngine.SceneManagement;
2025-05-23 18:26:47 +08:00
using YooAsset;
namespace Stary.Evo
{
2025-09-02 14:15:18 +08:00
public class ResStartState : AbstractFSMIStateAsync
2025-05-23 18:26:47 +08:00
{
2026-01-07 18:20:13 +08:00
private DomainConfig.LoadResType loadResType;
public GameObject mainPrefab;
private DomainConfig domainConfig;
2026-01-08 12:25:29 +08:00
private string _packageName;
2026-01-07 18:20:13 +08:00
private string _sceneName;
2025-05-23 18:26:47 +08:00
2026-01-07 18:20:13 +08:00
public ResStartState(IFsmSystemAsync system) : base(system)
2025-05-23 18:26:47 +08:00
{
}
2025-05-30 14:50:46 +08:00
2026-01-07 18:20:13 +08:00
public override UniTask OnEnterAsync()
2025-05-23 18:26:47 +08:00
{
return UniTask.CompletedTask;
}
2025-05-30 14:50:46 +08:00
2026-01-07 18:20:13 +08:00
public override UniTask OnEnterAsync<T>(T param)
2025-05-23 18:26:47 +08:00
{
return UniTask.CompletedTask;
}
2026-01-07 18:20:13 +08:00
public override async UniTask OnEnterAsync<T1, T2>(T1 param1, T2 param2)
2025-05-23 18:26:47 +08:00
{
2026-01-08 12:25:29 +08:00
if (AppConfig.DeveloperMode)
2026-01-07 18:20:13 +08:00
{
2026-01-08 12:25:29 +08:00
domainConfig = param1 as DomainConfig;
loadResType = domainConfig.loadResType;
_packageName = domainConfig.domain;
Type type = param2 as Type;
var package = YooAssets.GetPackage(domainConfig.domain);
switch (loadResType)
{
case DomainConfig.LoadResType.Prefab:
2026-01-07 18:20:13 +08:00
await LoadDomainPrefab(package);
2026-01-05 17:58:53 +08:00
2026-01-08 12:25:29 +08:00
break;
case DomainConfig.LoadResType.Scene:
var sceneMode = domainConfig.loadSceneMode;
var physicsMode = LocalPhysicsMode.None;
SceneHandle handle =
package.LoadSceneAsync(domainConfig.sceneIdentifier, sceneMode, physicsMode);
await handle;
Scene targetScene = SceneManager.GetSceneByName(handle.SceneName);
// targetScene.name = domainConfig.mainScene;
// 设置为 active scene 或者后续 Move 到该 scene
SceneManager.SetActiveScene(targetScene);
_sceneName = targetScene.name;
mainPrefab = GameObject.Find(domainConfig.mainPrefab);
if (mainPrefab == null)
{
await LoadDomainPrefab(package);
}
break;
}
2026-01-05 17:58:53 +08:00
2026-01-08 12:25:29 +08:00
if (domainConfig.domain != "Main")
2026-01-05 17:58:53 +08:00
{
2026-01-08 12:25:29 +08:00
LocalTransformInfo info = mainPrefab.GetOrAddComponent<LocalTransformInfo>();
FsmLoadSystem fsmLoadSystem = FsmSystem as FsmLoadSystem;
if (info._list.Count >= 2)
2026-01-07 18:20:13 +08:00
{
2026-01-08 12:25:29 +08:00
if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.PointCloud)
{
info.Switch(1);
}
else if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.VIOICE)
{
info.Switch(0);
}
else if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.ImageTracked)
{
info.transform.position = fsmLoadSystem.GetTransformCtor().position;
info.transform.rotation = Quaternion.Euler(fsmLoadSystem.GetTransformCtor().rotation);
info.transform.localScale = fsmLoadSystem.GetTransformCtor().scale;
}
else
{
info.Switch(0);
}
2026-01-07 18:20:13 +08:00
}
else
{
2026-01-08 12:25:29 +08:00
Debug.LogError($"UnityEvo:{mainPrefab.name}的TransformInfo长度小于2无法继续运行请排查");
2026-01-05 17:58:53 +08:00
}
}
2025-05-30 14:50:46 +08:00
2026-01-08 12:25:29 +08:00
if (mainPrefab != null)
2025-05-23 18:26:47 +08:00
{
2026-01-08 12:25:29 +08:00
DomainBase hotfixInstance = mainPrefab.GetComponent(type) as DomainBase;
if (hotfixInstance == null)
{
hotfixInstance = mainPrefab.AddComponent(type) as DomainBase;
}
2026-01-07 18:20:13 +08:00
2026-01-08 12:25:29 +08:00
if (hotfixInstance == null)
{
Debug.LogError($"热更类{type.Name}实例创建失败必须继承MonoBehaviour");
return;
}
2025-05-23 18:26:47 +08:00
2026-01-08 12:25:29 +08:00
hotfixInstance.DomainName = domainConfig.domain;
hotfixInstance.DomainNameRaw = $"{domainConfig.domain}_RawFile";
2025-05-23 18:26:47 +08:00
2026-01-08 12:25:29 +08:00
// 原有调用逻辑修改为使用实例
hotfixInstance.OnEnter("");
hotfixInstance.OnEnterAsync("");
}
}
else
{
_packageName = AppConfig.PackageDomainName;
2026-01-07 18:20:13 +08:00
}
2025-05-23 18:26:47 +08:00
}
2026-01-07 18:20:13 +08:00
private async UniTask LoadDomainPrefab(ResourcePackage package)
2025-05-30 14:50:46 +08:00
{
2026-01-07 18:20:13 +08:00
// 加载热更资源
var loadOperation = package.LoadAssetAsync<GameObject>(domainConfig.mainPrefab);
2026-01-05 17:58:53 +08:00
2026-01-07 18:20:13 +08:00
await loadOperation;
if (loadOperation.Status == EOperationStatus.Succeed)
2025-07-02 10:05:26 +08:00
{
2026-01-07 18:20:13 +08:00
#if Immersal
ARSpace arSpace = GameObject.FindObjectOfType<ARSpace>();
if (arSpace != null)
{
Debug.Log("UnityEvo:找到ARSpace开始加载点云运行环境...");
mainPrefab = loadOperation.InstantiateSync(arSpace.transform);
} else
{
Debug.Log("UnityEvo:未找到ARSpace开始加载普通运行环境通过语音唤醒...");
mainPrefab = loadOperation.InstantiateSync();
}
#elif NotPointClond
mainPrefab = loadOperation.InstantiateSync();
#endif
if (domainConfig.domain == "Main")
AppConfig.SetDefaultMainInstance(mainPrefab);
2025-07-02 10:05:26 +08:00
}
2025-05-30 14:50:46 +08:00
}
2026-01-07 18:20:13 +08:00
public override async UniTask OnExitAsync()
2025-05-23 18:26:47 +08:00
{
2026-01-08 12:25:29 +08:00
if (_packageName=="Main")
return;
2026-01-07 18:20:13 +08:00
if (HybridClREntrance.Global.stage == StageType.Developer)
{
2026-01-08 12:25:29 +08:00
DomainBase domainBase = mainPrefab.GetOrAddComponent<DomainBase>();
if (domainBase == null)
2026-01-07 18:20:13 +08:00
{
2026-01-08 12:25:29 +08:00
Debug.LogError($"UnityEvo:{mainPrefab.name}的DomainBase为空无法退出请排查");
}
else
{
domainBase.OnExit();
await domainBase.OnExitAsync();
2025-05-23 18:26:47 +08:00
2026-01-08 12:25:29 +08:00
GameObject.Destroy(domainBase.gameObject);
2026-01-07 18:20:13 +08:00
2026-01-08 12:25:29 +08:00
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(domainBase.DomainName);
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(domainBase.DomainNameRaw);
}
2026-01-07 18:20:13 +08:00
2026-01-08 12:25:29 +08:00
Debug.Log("UnityEvo:Domain退出...");
if (loadResType == DomainConfig.LoadResType.Scene)
{
await SceneManager.UnloadSceneAsync(_sceneName);
2026-01-07 18:20:13 +08:00
}
}
else if (HybridClREntrance.Global.stage == StageType.Originality)
{
2026-01-08 12:25:29 +08:00
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(_packageName);
2026-01-07 18:20:13 +08:00
AppConfig.PackageDomainName = "";
2026-01-08 12:25:29 +08:00
Debug.Log("UnityEvo:Domain退出...");
2026-01-07 18:20:13 +08:00
}
2025-05-23 18:26:47 +08:00
}
}
}