| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 | using UnityEngine;using UnityEngine.SceneManagement;namespace YooAsset{	/// <summary>	/// 场景卸载异步操作类	/// </summary>	public sealed class UnloadSceneOperation : AsyncOperationBase	{		private enum EFlag		{			Normal,			Error,		}		private enum ESteps		{			None,			UnLoad,			Checking,			Done,		}		private readonly EFlag _flag;		private ESteps _steps = ESteps.None;		private Scene _scene;		private AsyncOperation _asyncOp;		internal UnloadSceneOperation(string error)		{			_flag = EFlag.Error;			Error = error;		}		internal UnloadSceneOperation(Scene scene)		{			_flag = EFlag.Normal;			_scene = scene;		}		internal override void Start()		{			if (_flag == EFlag.Normal)			{				_steps = ESteps.UnLoad;			}			else if (_flag == EFlag.Error)			{				_steps = ESteps.Done;				Status = EOperationStatus.Failed;			}			else			{				throw new System.NotImplementedException(_flag.ToString());			}		}		internal override void Update()		{			if (_steps == ESteps.None || _steps == ESteps.Done)				return;			if (_steps == ESteps.UnLoad)			{				if (_scene.IsValid() && _scene.isLoaded)				{					_asyncOp = SceneManager.UnloadSceneAsync(_scene);					_steps = ESteps.Checking;				}				else				{					Error = "Scene is invalid or is not loaded.";					_steps = ESteps.Done;					Status = EOperationStatus.Failed;				}			}			if (_steps == ESteps.Checking)			{				Progress = _asyncOp.progress;				if (_asyncOp.isDone == false)					return;				_steps = ESteps.Done;				Status = EOperationStatus.Succeed;			}		}	}}
 |