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

89 lines
2.5 KiB
C#

// Small helper class to allow Fsm to call SetDirty
// Fsm is inside dll so cannot use #if UNITY_EDITOR
#if (UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7)
#define UNITY_PRE_5_0
#endif
#if (UNITY_4_3 || UNITY_4_5 || UNITY_4_6 || UNITY_4_7 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2)
#define UNITY_PRE_5_3
#endif
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
namespace HutongGames.PlayMaker
{
/// <summary>
/// Playmaker runtime code can't call unity editor code
/// This class is a workaround, allowing runtime code to call EditorUtility.SetDirty
/// </summary>
public class UpdateHelper
{
private static bool editorPrefLoaded;
#if UNITY_EDITOR
// loading editorprefs can be slow (?) so cache setting
private static bool _doLog;
private static bool doLog
{
get
{
if (!editorPrefLoaded)
{
// set by FsmEditorSettings
_doLog = EditorPrefs.GetBool("PlayMaker.LogFsmUpdatedMessages", false);
editorPrefLoaded = true;
}
return _doLog;
}
}
#endif
/// <summary>
/// Helper that can be called by reflection from runtime class without referencing UnityEditor
/// E.g. When Fsm is loaded it can need fixing and then needs to be marked dirty
/// </summary>
public static void SetDirty(Fsm fsm)
{
#if UNITY_EDITOR
// Unity 5.3.2 disallows scene dirty calls when playing
if (PlayMakerGlobals.IsPlaying) return;
if (fsm == null || fsm.OwnerObject == null) return;
if (doLog)
{
Debug.Log("FSM Updated: " + FsmUtility.GetFullFsmLabel(fsm) + "\nPlease re-save the scene/project.", fsm.OwnerObject);
}
fsm.Preprocessed = false; // force pre-process to run again
if (fsm.UsedInTemplate != null)
{
EditorUtility.SetDirty(fsm.UsedInTemplate);
}
else if (fsm.Owner != null)
{
EditorUtility.SetDirty(fsm.Owner);
#if !UNITY_PRE_5_3
if (fsm.Owner.gameObject != null)
{
UnityEditor.SceneManagement.EditorSceneManager.MarkSceneDirty(fsm.Owner.gameObject.scene);
}
#elif !UNITY_PRE_5_0
// Not sure if we need to do this...?
UnityEditor.EditorApplication.MarkSceneDirty();
#endif
}
#endif
}
}
}