You've already forked taptap2024_GJ_chidouren
109 lines
3.3 KiB
C#
109 lines
3.3 KiB
C#
|
|
using System;
|
|||
|
|
using Framework.Asset;
|
|||
|
|
using Framework.Timer;
|
|||
|
|
using UnityEngine;
|
|||
|
|
using UnityEngine.SceneManagement;
|
|||
|
|
using YooAsset;
|
|||
|
|
|
|||
|
|
namespace StateSystem.Loader
|
|||
|
|
{
|
|||
|
|
public enum SceneName
|
|||
|
|
{
|
|||
|
|
//初始化入口
|
|||
|
|
InitScene,
|
|||
|
|
|
|||
|
|
//主页面
|
|||
|
|
MainScene,
|
|||
|
|
|
|||
|
|
//游戏场景
|
|||
|
|
GameScene
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public class SceneLoader : ILoader
|
|||
|
|
{
|
|||
|
|
private readonly string _targetScene;
|
|||
|
|
private SceneHandle _asyncLoader;
|
|||
|
|
private Action _onComplete;
|
|||
|
|
private Action<float> _onLoading;
|
|||
|
|
private TimeHandler _actionTimer;
|
|||
|
|
public bool IsAutoLoad = false;
|
|||
|
|
|
|||
|
|
public SceneLoader (string targetScene)
|
|||
|
|
{
|
|||
|
|
this._targetScene = targetScene;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public SceneLoader (SceneName targetScene, bool isAutoLoad = false)
|
|||
|
|
{
|
|||
|
|
this.IsAutoLoad = isAutoLoad;
|
|||
|
|
this._targetScene = AssetManager.ResRootPath + "Scenes/" + targetScene.ToString () + ".unity";
|
|||
|
|
Debug.Log ("准备进入Scene: " + this._targetScene);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void BeginLoad (Action<float> onLoading, Action onComplete)
|
|||
|
|
{
|
|||
|
|
this._onLoading = onLoading;
|
|||
|
|
this._onComplete = onComplete;
|
|||
|
|
this._asyncLoader = YooAssets.LoadSceneAsync (this._targetScene , LoadSceneMode.Single);
|
|||
|
|
GameUpdateMgr.Instance.AddUpdater (OnUpdate);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void Active ()
|
|||
|
|
{
|
|||
|
|
Debug.Log ("ActiveScene");
|
|||
|
|
GameUpdateMgr.Instance.RemoveUpdater (OnUpdate);
|
|||
|
|
//最大超时3s后强制回调场景进入完成, 若期间_asyncLoader.progress >= 1 则表示已经进入场景
|
|||
|
|
this._actionTimer = GameUpdateMgr.Instance.CreateTimer (3, OnActive, CheckActiveState);
|
|||
|
|
this._asyncLoader.ActivateScene ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void CheckActiveState (float obj)
|
|||
|
|
{
|
|||
|
|
if (this._asyncLoader.Progress >= 1)
|
|||
|
|
{
|
|||
|
|
this._actionTimer.Kill ();
|
|||
|
|
OnActive ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnActive ()
|
|||
|
|
{
|
|||
|
|
var onComplete = this._onComplete;
|
|||
|
|
this._onComplete = null;
|
|||
|
|
onComplete?.Invoke ();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private void OnUpdate ()
|
|||
|
|
{
|
|||
|
|
//Unity的异步加载在90%的时候会自动停止,除非开启自动跳转才会加载后续部分,因此在加载到90%时判断加载完成即可。
|
|||
|
|
var percent = this._asyncLoader.Progress;
|
|||
|
|
// Debug.Log("加载进度: " + percent);
|
|||
|
|
if (percent >= 0.9f)
|
|||
|
|
{
|
|||
|
|
GameUpdateMgr.Instance.RemoveUpdater (OnUpdate);
|
|||
|
|
this._onLoading?.Invoke (1);
|
|||
|
|
if (this.IsAutoLoad)
|
|||
|
|
{
|
|||
|
|
Active ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
this._onLoading?.Invoke (percent);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private bool _isKill;
|
|||
|
|
|
|||
|
|
public void Kill ()
|
|||
|
|
{
|
|||
|
|
if (!this._isKill)
|
|||
|
|
{
|
|||
|
|
this._isKill = true;
|
|||
|
|
this._actionTimer?.Kill ();
|
|||
|
|
GameUpdateMgr.Instance.RemoveUpdater (OnUpdate);
|
|||
|
|
// this._asyncLoader.UnloadAsync ();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|