using System; using Cysharp.Threading.Tasks; using Stary.Evo; using Stary.Evo.InformationSave; using UnityEngine; using UnityEngine.SceneManagement; using YooAsset; namespace Stary.Evo { public class ResStartState : AbstractFSMIStateAsync { private DomainConfig domainConfig; public ResStartState(IFsmSystemAsync system) : base(system) { } public override async UniTask OnEnterAsync(T1 param1, T2 param2) { if (AppConfig.DeveloperMode) { domainConfig = param1 as DomainConfig; #if UNITY_WEBGL string typeName = $"{domainConfig.@namespace}.{domainConfig.className},{domainConfig.assemblyName}"; // 完整命名空间 Type type = Type.GetType(typeName); #else Type type = param2 as Type; #endif GameObject mainPrefab = null; //加载前卸载资源 await DomainAssetSystem.RemoveDomain(domainConfig); switch (domainConfig.loadResType) { case DomainConfig.LoadResType.Prefab: mainPrefab = await DomainAssetSystem.LoadDomainPrefab(domainConfig); await DomainAssetSystem.SetTransformInfo(mainPrefab); if (domainConfig.domainLoadType != DomainConfig.DomainLoadType.Static) { DomainAssetSystem.AddDomainNameEntity(domainConfig); } else { DomainAssetSystem.AddDomainStaticNameEntity(domainConfig); } break; case DomainConfig.LoadResType.Scene: var package = YooAssets.GetPackage(domainConfig.domain); var sceneMode = domainConfig.loadSceneMode; var physicsMode = LocalPhysicsMode.None; SceneHandle handle = package.LoadSceneAsync(domainConfig.sceneIdentifier, sceneMode, physicsMode); await handle; Scene targetScene = SceneManager.GetSceneByName(handle.SceneName); SceneManager.SetActiveScene(targetScene); mainPrefab = await DomainAssetSystem.LoadDomainPrefab(domainConfig); SceneManager.MoveGameObjectToScene(mainPrefab, targetScene); DomainAssetSystem.AddDomainNameEntity(domainConfig); break; } await DomainAssetSystem.BindableProperty(domainConfig, mainPrefab, type); } } } }