Files
art_test_main/Assets/Domain/Main/HotUpdate/ScenePanel.cs

145 lines
5.3 KiB
C#
Raw Normal View History

2025-11-03 11:25:01 +08:00
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;
2025-11-05 16:48:51 +08:00
using UnityEngine.UI;
2025-11-03 11:25:01 +08:00
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;
2025-11-05 16:48:51 +08:00
viewBg.transform.Find("Text").GetComponent<Text>().text = _scenesNames[i].sceneName;
2025-11-03 11:25:01 +08:00
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);
}
}
}
}