123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #if UNITY_EDITOR
- using UnityEditor;
- using UnityEditor.Callbacks;
- using UnityEngine;
- namespace UniRx
- {
- [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()
- {
- #if UNITY_2017_2_OR_NEWER
- EditorApplication.playModeStateChanged += e =>
- #else
- EditorApplication.playmodeStateChanged += () =>
- #endif
- {
- // 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
|