using System; using System.Threading.Tasks; using DG.Tweening; using Stary.Evo; using Stary.Evo.RKTools; using Stary.Evo.UIFarme; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; using YooAsset; namespace Main { public class ScenePanel : BasePanel, IBasePanel { public override UITweenType TweenType => UITweenType.Fade; private ArtScene[] _scenesNames; private GameObject[] _sceneGrids; private string _currentSceneName; public override async Task InitializeAsync(GameObject panelGo) { await base.InitializeAsync(panelGo); } public override void OnEnter(Action complete = null) { base.OnEnter(complete); StringEventSystem.Global.Send("X_ButtonHierarchyType",DeviceXEventHandler.HierarchyType.ScenePanel); this.RegisterEvent("SetSceneData", SetSceneData); } private async void SetSceneData(string name) { var handle = YooAssets.LoadAssetAsync("Config_ArtSceneData"); await handle.Task; var artSceneData = handle.GetAssetObject(); if (artSceneData == null) { Debug.LogError($"在domain:{name} ArtSceneData 资源不存在,请检查!"); return; } _scenesNames = artSceneData.artScenes.ToArray(); _sceneGrids = new GameObject[_scenesNames.Length]; SetSceneGrids(); } private async void SetSceneGrids() { if (_scenesNames != null && _scenesNames.Length > 0) { var package = YooAssets.TryGetPackage("Main"); var handle = package.LoadAssetAsync(R.Res.Main.prefabs.viewbg_prefab); await handle.Task; var grid = this.activePanel.transform.Find("Grid"); // float count = _scenesNames.Length / 2f; // float x = (-70 * count) + 35; for (int i = 0; i < _scenesNames.Length; i++) { //x += (70 * i); var viewBg = handle.InstantiateSync(); viewBg.transform.SetParent(grid); viewBg.transform.localPosition = Vector3.zero; viewBg.transform.localRotation = Quaternion.identity; viewBg.transform.localScale = Vector3.one; viewBg.transform.Find("Text").GetComponent().text = _scenesNames[i].sceneName; viewBg.name = _scenesNames[i].sceneName; _sceneGrids[i] = viewBg; viewBg.gameObject.ObjectAddTouchEvent(OnTouchComplete); } } } private async void OnTouchComplete(GameObject obj) { for (int i = 0; i < _sceneGrids.Length; i++) { _sceneGrids[i].gameObject.ObjectPauseTouchEvent(); } ArtScene artScene = null; for (int i = 0; i < _scenesNames.Length; i++) { if (_scenesNames[i].sceneName == obj.name) { artScene = _scenesNames[i]; } } var sceneMode = LoadSceneMode.Additive; var physicsMode = LocalPhysicsMode.None; SceneHandle handle = YooAssets.LoadSceneAsync(artScene.sceneIdentifier, sceneMode, physicsMode); await handle.Task; Scene targetScene = SceneManager.GetSceneByName(handle.SceneName); // 设置为 active scene 或者后续 Move 到该 scene SceneManager.SetActiveScene(targetScene); GameObject.Destroy(GameObject.Find("RKCameraRigTest")); _currentSceneName = targetScene.name; //注册卸载当前场景事件 StringEventSystem.Global.Register("UnloadCurrentScene", UnloadCurrentScene); StringEventSystem.Global.Send("X_ButtonHierarchyType",DeviceXEventHandler.HierarchyType.SceneActive); // 场景加载完成后,Fade 出当前场景 this.canvasGroup.DOFade(0, 1f).OnComplete(() => { this.canvasGroup.alpha = 0; }); } public override void OnExit(float delay = 0f) { base.OnExit(delay); this.UnRegisterEvent("SetSceneData", SetSceneData); for (int i = 0; i < _sceneGrids.Length; i++) { _sceneGrids[i].gameObject.ObjectRemoveTouchEvent(); GameObject.Destroy(_sceneGrids[i].gameObject); } _sceneGrids = null; } private void UnloadCurrentScene() { if (!string.IsNullOrEmpty(_currentSceneName)) { SceneManager.UnloadSceneAsync(_currentSceneName); this.canvasGroup.DOFade(1, 1f).OnComplete(() => { this.canvasGroup.alpha = 1; for (int i = 0; i < _sceneGrids.Length; i++) { _sceneGrids[i].gameObject.ObjectResumeTouchEvent(); } }); StringEventSystem.Global.Send("X_ButtonHierarchyType",DeviceXEventHandler.HierarchyType.ScenePanel); } } } }