KonTrax
1/11/2015 - 11:10 PM

ScenePlaybackDetector

ScenePlaybackDetector


EditorApplication.playmodeStateChanged

Before scene start:        isPlayingOrWillChangePlaymode = false;   isPlaying = false
Pressed Playback button:   isPlayingOrWillChangePlaymode = true;    isPlaying = false
Playing:                   isPlayingOrWillChangePlaymode = false;   isPlaying = true
Pressed stop button:       isPlayingOrWillChangePlaymode = true;    isPlaying = true
#if UNITY_EDITOR

using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;

namespace NameSpace
{
// #############################################################################

[InitializeOnLoad]
public class ScenePlaybackDetector
{
	private static bool _isPlaying = false;

	private static bool AboutToStartScene
	{
		get { return EditorPrefs.GetBool("AboutToStartScene"); }
		set { EditorPrefs.SetBool("AboutToStartScene", value); }
	}

	public static bool IsPlaying
	{
		get { return _isPlaying; }
		set {
			if (_isPlaying != value) _isPlaying = value;
		}
	}

	// This callback is notified after scripts have been reloaded.
	[DidReloadScripts]
	public static void OnDidReloadScripts()
	{
		// Filter DidReloadScripts callbacks to the moment where playmodeState transitions into isPlaying.
		if (AboutToStartScene) IsPlaying = true;
	}

	// InitializeOnLoad ensures that this constructor is called when the Unity Editor is started.
	static ScenePlaybackDetector()
	{
		EditorApplication.playmodeStateChanged += () =>
		{
			// Before scene start:        isPlayingOrWillChangePlaymode = false;   isPlaying = false
			// Pressed Playback button:   isPlayingOrWillChangePlaymode = true;    isPlaying = false
			// Playing:                   isPlayingOrWillChangePlaymode = false;   isPlaying = true
			// Pressed stop button:       isPlayingOrWillChangePlaymode = true;    isPlaying = true
			if (EditorApplication.isPlayingOrWillChangePlaymode && !EditorApplication.isPlaying)
			{
				AboutToStartScene = true;
			}
			else
			{
				AboutToStartScene = false;
			}

			// Detect when playback is stopped.
			if (!EditorApplication.isPlaying)
			{
				IsPlaying = false;
			}
		};
	}
}

// #############################################################################
}

#endif