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;
|
2025-05-23 18:26:47 +08:00
|
|
|
|
|
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-07 18:35:45 +08:00
|
|
|
|
if (domainConfig == null && HybridClREntrance.Global.stage == StageType.Originality)
|
2026-01-07 18:20:13 +08:00
|
|
|
|
return;
|
|
|
|
|
|
domainConfig = param1 as DomainConfig;
|
|
|
|
|
|
loadResType = domainConfig.loadResType;
|
|
|
|
|
|
Type type = param2 as Type;
|
|
|
|
|
|
var package = YooAssets.GetPackage(domainConfig.domain);
|
|
|
|
|
|
switch (loadResType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case DomainConfig.LoadResType.Prefab:
|
|
|
|
|
|
|
|
|
|
|
|
await LoadDomainPrefab(package);
|
|
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
|
}
|
2026-01-05 17:58:53 +08:00
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
break;
|
2026-01-05 17:58:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
if (domainConfig.domain != "Main")
|
2025-07-02 10:05:26 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
LocalTransformInfo info = mainPrefab.GetOrAddComponent<LocalTransformInfo>();
|
|
|
|
|
|
FsmLoadSystem fsmLoadSystem = FsmSystem as FsmLoadSystem;
|
2026-01-05 17:58:53 +08:00
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
if (info._list.Count >= 2)
|
2026-01-05 17:58:53 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
if (fsmLoadSystem.GetOpenDomainType() == OpenDomainType.PointCloud)
|
2026-01-05 17:58:53 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
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-05 17:58:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-07 18:20:13 +08:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
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-07 18:20:13 +08:00
|
|
|
|
if (mainPrefab != null)
|
2025-05-30 14:50:46 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
DomainBase hotfixInstance = mainPrefab.GetComponent(type) as DomainBase;
|
|
|
|
|
|
if (hotfixInstance == null)
|
2025-05-23 18:26:47 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
hotfixInstance = mainPrefab.AddComponent(type) as DomainBase;
|
2025-05-23 18:26:47 +08:00
|
|
|
|
}
|
2026-01-07 18:20:13 +08:00
|
|
|
|
|
|
|
|
|
|
if (hotfixInstance == null)
|
2025-05-23 18:26:47 +08:00
|
|
|
|
{
|
2026-01-07 18:20:13 +08:00
|
|
|
|
Debug.LogError($"热更类{type.Name}实例创建失败!必须继承MonoBehaviour");
|
|
|
|
|
|
return;
|
2025-05-23 18:26:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
hotfixInstance.DomainName = domainConfig.domain;
|
|
|
|
|
|
hotfixInstance.DomainNameRaw = $"{domainConfig.domain}_RawFile";
|
2025-05-23 18:26:47 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
// 原有调用逻辑修改为使用实例
|
|
|
|
|
|
hotfixInstance.OnEnter("");
|
|
|
|
|
|
hotfixInstance.OnEnterAsync("");
|
|
|
|
|
|
}
|
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-07 18:20:13 +08:00
|
|
|
|
Debug.Log("UnityEvo:Domain退出...");
|
|
|
|
|
|
if (HybridClREntrance.Global.stage == StageType.Developer)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (domainConfig.domain != "Main")
|
|
|
|
|
|
{
|
|
|
|
|
|
DomainBase domainBase = mainPrefab.GetOrAddComponent<DomainBase>();
|
|
|
|
|
|
if (domainBase == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
Debug.LogError($"UnityEvo:{mainPrefab.name}的DomainBase为空,无法退出,请排查");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
domainBase.OnExit();
|
|
|
|
|
|
await domainBase.OnExitAsync();
|
|
|
|
|
|
}
|
2025-05-23 18:26:47 +08:00
|
|
|
|
|
2026-01-07 18:20:13 +08:00
|
|
|
|
if (domainBase != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
GameObject.Destroy(domainBase.gameObject);
|
|
|
|
|
|
|
|
|
|
|
|
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(domainBase.DomainName);
|
|
|
|
|
|
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(domainBase.DomainNameRaw);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (loadResType == DomainConfig.LoadResType.Scene)
|
|
|
|
|
|
{
|
|
|
|
|
|
await SceneManager.UnloadSceneAsync(_sceneName);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (HybridClREntrance.Global.stage == StageType.Originality)
|
|
|
|
|
|
{
|
|
|
|
|
|
await ((FsmLoadSystem)FsmSystem).ForceUnloadAllAssets(AppConfig.PackageDomainName);
|
|
|
|
|
|
AppConfig.PackageDomainName = "";
|
|
|
|
|
|
}
|
2025-05-23 18:26:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|