修复场景加载时设置自动激活 false 无效 #121

mlyDevMerge1.5.7
Kele 2023-06-27 15:56:39 +08:00 committed by QiJing
parent 90d8842f06
commit 6acf9f6302
6 changed files with 53 additions and 30 deletions

View File

@ -147,7 +147,7 @@ namespace YooAsset
/// <summary> /// <summary>
/// 加载场景 /// 加载场景
/// </summary> /// </summary>
public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation ,int priority)
{ {
if (assetInfo.IsInvalid) if (assetInfo.IsInvalid)
{ {
@ -168,9 +168,9 @@ namespace YooAsset
ProviderBase provider; ProviderBase provider;
{ {
if (_simulationOnEditor) if (_simulationOnEditor)
provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode, priority); provider = new DatabaseSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, priority);
else else
provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode, priority); provider = new BundledSceneProvider(this, providerGUID, assetInfo, sceneMode,allowSceneActivation, priority);
provider.InitSpawnDebugInfo(); provider.InitSpawnDebugInfo();
_providerList.Add(provider); _providerList.Add(provider);
_providerDic.Add(providerGUID, provider); _providerDic.Add(providerGUID, provider);

View File

@ -6,9 +6,10 @@ namespace YooAsset
{ {
private System.Action<SceneOperationHandle> _callback; private System.Action<SceneOperationHandle> _callback;
internal string PackageName { set; get; } internal string PackageName { set; get; }
private ProviderBase _providerBase;
internal SceneOperationHandle(ProviderBase provider) : base(provider) internal SceneOperationHandle(ProviderBase provider) : base(provider)
{ {
_providerBase = provider;
} }
internal override void InvokeCallback() internal override void InvokeCallback()
{ {
@ -58,9 +59,23 @@ namespace YooAsset
if (IsValidWithWarning == false) if (IsValidWithWarning == false)
return false; return false;
if (SceneObject.IsValid() && SceneObject.isLoaded) if (SceneObject.IsValid())
{ {
return SceneManager.SetActiveScene(SceneObject); var isChangeState = false;
#if UNITY_EDITOR
if (_providerBase is DatabaseSceneProvider dsp)
{
dsp.AsyncOp.allowSceneActivation = true;
isChangeState = true;
}
#endif
if (_providerBase is BundledSceneProvider bsp)
{
bsp.AsyncOp.allowSceneActivation = true;
isChangeState = true;
}
return isChangeState;
} }
else else
{ {

View File

@ -11,13 +11,15 @@ namespace YooAsset
public readonly LoadSceneMode SceneMode; public readonly LoadSceneMode SceneMode;
private readonly string _sceneName; private readonly string _sceneName;
private readonly int _priority; private readonly int _priority;
private AsyncOperation _asyncOp; private readonly bool _allowSceneActivation;
public AsyncOperation AsyncOp { private set; get; }
public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) : base(impl, providerGUID, assetInfo) public BundledSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo)
{ {
SceneMode = sceneMode; SceneMode = sceneMode;
_sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath); _sceneName = Path.GetFileNameWithoutExtension(assetInfo.AssetPath);
_priority = priority; _priority = priority;
_allowSceneActivation = allowSceneActivation;
} }
public override void Update() public override void Update()
{ {
@ -62,11 +64,11 @@ namespace YooAsset
if (Status == EStatus.Loading) if (Status == EStatus.Loading)
{ {
// 注意如果场景不存在则返回NULL // 注意如果场景不存在则返回NULL
_asyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode); AsyncOp = SceneManager.LoadSceneAsync(MainAssetInfo.AssetPath, SceneMode);
if (_asyncOp != null) if (AsyncOp != null)
{ {
_asyncOp.allowSceneActivation = true; AsyncOp.allowSceneActivation = _allowSceneActivation;
_asyncOp.priority = _priority; AsyncOp.priority = _priority;
SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
Status = EStatus.Checking; Status = EStatus.Checking;
} }
@ -82,8 +84,8 @@ namespace YooAsset
// 3. 检测加载结果 // 3. 检测加载结果
if (Status == EStatus.Checking) if (Status == EStatus.Checking)
{ {
Progress = _asyncOp.progress; Progress = AsyncOp.progress;
if (_asyncOp.isDone) if (AsyncOp.isDone)
{ {
Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed;
if (Status == EStatus.Failed) if (Status == EStatus.Failed)

View File

@ -7,12 +7,14 @@ namespace YooAsset
{ {
public readonly LoadSceneMode SceneMode; public readonly LoadSceneMode SceneMode;
private readonly int _priority; private readonly int _priority;
private AsyncOperation _asyncOp; private readonly bool _allowSceneActivation;
public AsyncOperation AsyncOp { private set; get; }
public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, int priority) : base(impl, providerGUID, assetInfo) public DatabaseSceneProvider(AssetSystemImpl impl, string providerGUID, AssetInfo assetInfo, LoadSceneMode sceneMode, bool allowSceneActivation, int priority) : base(impl, providerGUID, assetInfo)
{ {
SceneMode = sceneMode; SceneMode = sceneMode;
_priority = priority; _priority = priority;
_allowSceneActivation = allowSceneActivation;
} }
public override void Update() public override void Update()
{ {
@ -52,11 +54,11 @@ namespace YooAsset
{ {
LoadSceneParameters loadSceneParameters = new LoadSceneParameters(); LoadSceneParameters loadSceneParameters = new LoadSceneParameters();
loadSceneParameters.loadSceneMode = SceneMode; loadSceneParameters.loadSceneMode = SceneMode;
_asyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters); AsyncOp = UnityEditor.SceneManagement.EditorSceneManager.LoadSceneAsyncInPlayMode(MainAssetInfo.AssetPath, loadSceneParameters);
if (_asyncOp != null) if (AsyncOp != null)
{ {
_asyncOp.allowSceneActivation = true; AsyncOp.allowSceneActivation = _allowSceneActivation;
_asyncOp.priority = _priority; AsyncOp.priority = _priority;
SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1); SceneObject = SceneManager.GetSceneAt(SceneManager.sceneCount - 1);
Status = EStatus.Checking; Status = EStatus.Checking;
} }
@ -72,8 +74,8 @@ namespace YooAsset
// 3. 检测加载结果 // 3. 检测加载结果
if (Status == EStatus.Checking) if (Status == EStatus.Checking)
{ {
Progress = _asyncOp.progress; Progress = AsyncOp.progress;
if (_asyncOp.isDone) if (AsyncOp.isDone)
{ {
Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed; Status = SceneObject.IsValid() ? EStatus.Succeed : EStatus.Failed;
if (Status == EStatus.Failed) if (Status == EStatus.Failed)

View File

@ -455,12 +455,13 @@ namespace YooAsset
/// </summary> /// </summary>
/// <param name="location">场景的定位地址</param> /// <param name="location">场景的定位地址</param>
/// <param name="sceneMode">场景加载模式</param> /// <param name="sceneMode">场景加载模式</param>
/// <param name="allowSceneActivation">场景加载后自动激活</param>
/// <param name="priority">优先级</param> /// <param name="priority">优先级</param>
public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) public SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100)
{ {
DebugCheckInitialize(); DebugCheckInitialize();
AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null); AssetInfo assetInfo = ConvertLocationToAssetInfo(location, null);
var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, priority); var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority);
return handle; return handle;
} }
@ -469,11 +470,12 @@ namespace YooAsset
/// </summary> /// </summary>
/// <param name="assetInfo">场景的资源信息</param> /// <param name="assetInfo">场景的资源信息</param>
/// <param name="sceneMode">场景加载模式</param> /// <param name="sceneMode">场景加载模式</param>
/// <param name="allowSceneActivation">场景加载后自动激活</param>
/// <param name="priority">优先级</param> /// <param name="priority">优先级</param>
public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) public SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100)
{ {
DebugCheckInitialize(); DebugCheckInitialize();
var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode, priority); var handle = _assetSystemImpl.LoadSceneAsync(assetInfo, sceneMode,allowSceneActivation, priority);
return handle; return handle;
} }
#endregion #endregion

View File

@ -128,11 +128,12 @@ namespace YooAsset
/// </summary> /// </summary>
/// <param name="location">场景的定位地址</param> /// <param name="location">场景的定位地址</param>
/// <param name="sceneMode">场景加载模式</param> /// <param name="sceneMode">场景加载模式</param>
/// <param name="allowSceneActivation">场景加载后自动激活</param>
/// <param name="priority">优先级</param> /// <param name="priority">优先级</param>
public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) public static SceneOperationHandle LoadSceneAsync(string location, LoadSceneMode sceneMode = LoadSceneMode.Single,bool allowSceneActivation = true, int priority = 100)
{ {
DebugCheckDefaultPackageValid(); DebugCheckDefaultPackageValid();
return _defaultPackage.LoadSceneAsync(location, sceneMode, priority); return _defaultPackage.LoadSceneAsync(location, sceneMode, allowSceneActivation, priority);
} }
/// <summary> /// <summary>
@ -140,11 +141,12 @@ namespace YooAsset
/// </summary> /// </summary>
/// <param name="assetInfo">场景的资源信息</param> /// <param name="assetInfo">场景的资源信息</param>
/// <param name="sceneMode">场景加载模式</param> /// <param name="sceneMode">场景加载模式</param>
/// <param name="allowSceneActivation">场景加载后自动激活</param>
/// <param name="priority">优先级</param> /// <param name="priority">优先级</param>
public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, int priority = 100) public static SceneOperationHandle LoadSceneAsync(AssetInfo assetInfo, LoadSceneMode sceneMode = LoadSceneMode.Single, bool allowSceneActivation = true, int priority = 100)
{ {
DebugCheckDefaultPackageValid(); DebugCheckDefaultPackageValid();
return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, priority); return _defaultPackage.LoadSceneAsync(assetInfo, sceneMode, allowSceneActivation, priority);
} }
#endregion #endregion