165 lines
4.5 KiB
C#
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 |