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}"; Debug.Log($"尝试获取类型: {typeName}"); Type type = Type.GetType(typeName); if (type != null) { Debug.Log($"成功获取类型: {type.FullName}"); } else { Debug.LogError($"无法找到类型: {typeName}"); // 尝试使用备选方案 foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { var foundType = assembly.GetType($"{domainConfig.@namespace}.{domainConfig.className}"); if (foundType != null) { Debug.Log($"在程序集 {assembly.FullName} 中找到类型: {foundType.FullName}"); type = foundType; break; } } } #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); } } } }