Files
art_test_main/Assets/Domain/Main/HotUpdate/ScenePanel.cs
2025-11-03 11:25:01 +08:00

146 lines
5.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Threading.Tasks;
using DG.Tweening;
using Stary.Evo;
using Stary.Evo.RKTools;
using Stary.Evo.UIFarme;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UIElements;
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<string, string>("SetSceneData", SetSceneData);
}
private async void SetSceneData(string name)
{
var handle = YooAssets.LoadAssetAsync<ArtSceneData>("Config_ArtSceneData");
await handle.Task;
var artSceneData = handle.GetAssetObject<ArtSceneData>();
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<GameObject>(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<TextMeshProUGUI>().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<string, string>("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);
}
}
}
}