Files
beyond/Assets/ThirdParty/PlayMaker/Actions/SceneManager/UnloadScene.cs
2024-11-20 15:21:28 +01:00

165 lines
4.5 KiB
C#

// (c) Copyright HutongGames, LLC 2010-2016. All rights reserved.
#if UNITY_5_3 || UNITY_5_3_OR_NEWER
using System;
using UnityEngine;
using UnityEngine.SceneManagement;
namespace HutongGames.PlayMaker.Actions
{
#pragma warning disable 162
#if UNITY_5_5_OR_NEWER
[Obsolete("Use UnloadSceneAsynch Instead")]
#endif
[ActionCategory(ActionCategory.Scene)]
[Tooltip("Unload Scene. Note that assets are currently not unloaded, in order to free up asset memory call Resources.UnloadUnusedAssets.")]
public class UnloadScene : FsmStateAction
{
public enum SceneReferenceOptions {ActiveScene,SceneAtBuildIndex,SceneAtIndex,SceneByName,SceneByPath,SceneByGameObject};
[Tooltip("The reference options of the Scene")]
public SceneReferenceOptions sceneReference;
[Tooltip("The name of the scene to load. The given sceneName can either be the last part of the path, without .unity extension or the full path still without the .unity extension")]
public FsmString sceneByName;
[Tooltip("The build index of the scene to unload.")]
public FsmInt sceneAtBuildIndex;
[Tooltip("The index of the scene to unload.")]
public FsmInt sceneAtIndex;
[Tooltip("The scene Path.")]
public FsmString sceneByPath;
[Tooltip("The GameObject unload scene of")]
public FsmOwnerDefault sceneByGameObject;
[ActionSection("Result")]
[Tooltip("True if scene was unloaded")]
[UIHint(UIHint.Variable)]
public FsmBool unloaded;
[Tooltip("Event sent if scene was unloaded ")]
public FsmEvent unloadedEvent;
[Tooltip("Event sent scene was not unloaded")]
[UIHint(UIHint.Variable)]
public FsmEvent failureEvent;
public override void Reset()
{
sceneReference = SceneReferenceOptions.SceneAtBuildIndex;
sceneByName = null;
sceneAtBuildIndex = null;
sceneAtIndex = null;
sceneByPath = null;
sceneByGameObject = null;
unloaded = null;
unloadedEvent = null;
failureEvent = null;
}
public override void OnEnter()
{
bool _unloaded = false;
try{
switch (sceneReference) {
case SceneReferenceOptions.ActiveScene:
#if UNITY_5_4_OR_NEWER
_unloaded = SceneManager.UnloadScene(SceneManager.GetActiveScene());
#else
LogError("SceneReferenceOptions.ActiveScene not available in this version of Unity");
#endif
break;
case SceneReferenceOptions.SceneAtBuildIndex:
_unloaded = SceneManager.UnloadScene(sceneAtBuildIndex.Value);
break;
case SceneReferenceOptions.SceneAtIndex:
#if UNITY_5_4_OR_NEWER
_unloaded = SceneManager.UnloadScene(SceneManager.GetSceneAt(sceneAtIndex.Value));
#else
LogError("SceneReferenceOptions.SceneAtIndex not available in this version of Unity");
#endif
break;
case SceneReferenceOptions.SceneByName:
_unloaded = SceneManager.UnloadScene (sceneByName.Value);
break;
case SceneReferenceOptions.SceneByPath:
#if UNITY_5_4_OR_NEWER
_unloaded = SceneManager.UnloadScene(SceneManager.GetSceneByPath(sceneByPath.Value));
#else
LogError("SceneReferenceOptions.SceneByPath not available in this version of Unity");
#endif
break;
case SceneReferenceOptions.SceneByGameObject:
#if UNITY_5_4_OR_NEWER
GameObject _go = Fsm.GetOwnerDefaultTarget (sceneByGameObject);
if (_go==null)
{
throw new Exception ("Null GameObject");
}else{
_unloaded = SceneManager.UnloadScene(_go.scene);
}
#else
LogError("SceneReferenceOptions.SceneByGameObject not available in this version of Unity");
#endif
break;
}
}catch(Exception e)
{
LogError(e.Message);
}
if (!unloaded.IsNone)
unloaded.Value = _unloaded;
if (_unloaded) {
Fsm.Event (unloadedEvent);
} else {
Fsm.Event (failureEvent);
}
Finish();
}
public override string ErrorCheck()
{
switch (sceneReference) {
case SceneReferenceOptions.ActiveScene:
#if ! UNITY_5_4_OR_NEWER
return "ActiveScene not available in this version of Unity";
#endif
break;
case SceneReferenceOptions.SceneAtIndex:
#if ! UNITY_5_4_OR_NEWER
return "SceneAtIndex not available in this version of Unity";
#endif
break;
case SceneReferenceOptions.SceneByPath:
#if ! UNITY_5_4_OR_NEWER
return "SceneByPath not available in this version of Unity";
#endif
break;
case SceneReferenceOptions.SceneByGameObject:
#if ! UNITY_5_4_OR_NEWER
return "SceneByGameObject not available in this version of Unity";
#endif
break;
}
return string.Empty;
}
}
}
#endif