146 lines
5.4 KiB
C#
146 lines
5.4 KiB
C#
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);
|
||
|
||
}
|
||
}
|
||
}
|
||
} |