175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C#
		
	
	
	
using UnityEngine.SceneManagement;
 | 
						|
 | 
						|
namespace YooAsset
 | 
						|
{
 | 
						|
    public class SceneHandle : HandleBase
 | 
						|
    {
 | 
						|
        private System.Action<SceneHandle> _callback;
 | 
						|
        internal string PackageName { set; get; }
 | 
						|
 | 
						|
        internal SceneHandle(ProviderBase provider) : base(provider)
 | 
						|
        {
 | 
						|
        }
 | 
						|
        internal override void InvokeCallback()
 | 
						|
        {
 | 
						|
            _callback?.Invoke(this);
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 完成委托
 | 
						|
        /// </summary>
 | 
						|
        public event System.Action<SceneHandle> Completed
 | 
						|
        {
 | 
						|
            add
 | 
						|
            {
 | 
						|
                if (IsValidWithWarning == false)
 | 
						|
                    throw new System.Exception($"{nameof(SceneHandle)} is invalid");
 | 
						|
                if (Provider.IsDone)
 | 
						|
                    value.Invoke(this);
 | 
						|
                else
 | 
						|
                    _callback += value;
 | 
						|
            }
 | 
						|
            remove
 | 
						|
            {
 | 
						|
                if (IsValidWithWarning == false)
 | 
						|
                    throw new System.Exception($"{nameof(SceneHandle)} is invalid");
 | 
						|
                _callback -= value;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 场景名称
 | 
						|
        /// </summary>
 | 
						|
        public string SceneName
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (IsValidWithWarning == false)
 | 
						|
                    return string.Empty;
 | 
						|
                return Provider.SceneName;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 场景对象
 | 
						|
        /// </summary>
 | 
						|
        public Scene SceneObject
 | 
						|
        {
 | 
						|
            get
 | 
						|
            {
 | 
						|
                if (IsValidWithWarning == false)
 | 
						|
                    return new Scene();
 | 
						|
                return Provider.SceneObject;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 激活场景(当同时存在多个场景时用于切换激活场景)
 | 
						|
        /// </summary>
 | 
						|
        public bool ActivateScene()
 | 
						|
        {
 | 
						|
            if (IsValidWithWarning == false)
 | 
						|
                return false;
 | 
						|
 | 
						|
            if (SceneObject.IsValid() && SceneObject.isLoaded)
 | 
						|
            {
 | 
						|
                return SceneManager.SetActiveScene(SceneObject);
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                YooLogger.Warning($"Scene is invalid or not loaded : {SceneObject.name}");
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 解除场景加载挂起操作
 | 
						|
        /// </summary>
 | 
						|
        public bool UnSuspend()
 | 
						|
        {
 | 
						|
            if (IsValidWithWarning == false)
 | 
						|
                return false;
 | 
						|
 | 
						|
            if (SceneObject.IsValid())
 | 
						|
            {
 | 
						|
                if (Provider is DatabaseSceneProvider)
 | 
						|
                {
 | 
						|
                    var temp = Provider as DatabaseSceneProvider;
 | 
						|
                    return temp.UnSuspendLoad();
 | 
						|
                }
 | 
						|
                else if (Provider is BundledSceneProvider)
 | 
						|
                {
 | 
						|
                    var temp = Provider as BundledSceneProvider;
 | 
						|
                    return temp.UnSuspendLoad();
 | 
						|
                }
 | 
						|
                else
 | 
						|
                {
 | 
						|
                    throw new System.NotImplementedException();
 | 
						|
                }
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                YooLogger.Warning($"Scene is invalid : {SceneObject.name}");
 | 
						|
                return false;
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 是否为主场景
 | 
						|
        /// </summary>
 | 
						|
        public bool IsMainScene()
 | 
						|
        {
 | 
						|
            if (IsValidWithWarning == false)
 | 
						|
                return false;
 | 
						|
 | 
						|
            if (Provider is DatabaseSceneProvider)
 | 
						|
            {
 | 
						|
                var temp = Provider as DatabaseSceneProvider;
 | 
						|
                return temp.SceneMode == LoadSceneMode.Single;
 | 
						|
            }
 | 
						|
            else if (Provider is BundledSceneProvider)
 | 
						|
            {
 | 
						|
                var temp = Provider as BundledSceneProvider;
 | 
						|
                return temp.SceneMode == LoadSceneMode.Single;
 | 
						|
            }
 | 
						|
            else
 | 
						|
            {
 | 
						|
                throw new System.NotImplementedException();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        /// <summary>
 | 
						|
        /// 异步卸载子场景
 | 
						|
        /// </summary>
 | 
						|
        public UnloadSceneOperation UnloadAsync()
 | 
						|
        {
 | 
						|
            string packageName = GetAssetInfo().PackageName;
 | 
						|
 | 
						|
            // 如果句柄无效
 | 
						|
            if (IsValidWithWarning == false)
 | 
						|
            {
 | 
						|
                string error = $"{nameof(SceneHandle)} is invalid.";
 | 
						|
                var operation = new UnloadSceneOperation(error);
 | 
						|
                OperationSystem.StartOperation(packageName, operation);
 | 
						|
                return operation;
 | 
						|
            }
 | 
						|
 | 
						|
            // 如果是主场景
 | 
						|
            if (IsMainScene())
 | 
						|
            {
 | 
						|
                string error = $"Cannot unload main scene. Use {nameof(YooAssets.LoadSceneAsync)} method to change the main scene !";
 | 
						|
                YooLogger.Error(error);
 | 
						|
                var operation = new UnloadSceneOperation(error);
 | 
						|
                OperationSystem.StartOperation(packageName, operation);
 | 
						|
                return operation;
 | 
						|
            }
 | 
						|
 | 
						|
            // 卸载子场景
 | 
						|
            {
 | 
						|
                var operation = new UnloadSceneOperation(Provider);
 | 
						|
                OperationSystem.StartOperation(packageName, operation);
 | 
						|
                return operation;
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |