You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

120 lines
3.8 KiB
C#

using UnityEngine;
using System.Collections;
namespace MalbersAnimations
{
/// <summary> Going slow motion on user input</summary>
[AddComponentMenu("Malbers/Utilities/Managers/Slow Motion")]
public class SlowMotion : MonoBehaviour
{
[Space]
[Range(0.05f, 1), SerializeField] float slowMoTimeScale = 0.25f;
[Range(0.1f, 2), SerializeField] float slowMoSpeed = .2f;
private bool PauseGame = false;
private float CurrentTime = 1;
IEnumerator SlowTime_C;
private void Reset()
{ CreateInputs(); }
public void PauseEditor() => Debug.Break();
public void Slow_Motion()
{
if (SlowTime_C != null || !enabled) return; //Means that the Coroutine for slowmotion is still live
if (Time.timeScale == 1.0F)
{
SlowTime_C = SlowTime();
StartCoroutine(SlowTime_C);
}
else
{
SlowTime_C = RestartTime();
StartCoroutine(SlowTime_C);
}
Time.fixedDeltaTime = 0.02F * Time.timeScale;
}
public virtual void Freeze_Game()
{
PauseGame ^= true;
CurrentTime = Time.timeScale != 0 ? Time.timeScale : CurrentTime;
Time.timeScale = PauseGame ? 0 : CurrentTime;
}
IEnumerator SlowTime()
{
while (Time.timeScale > slowMoTimeScale)
{
Time.timeScale = Mathf.Clamp(Time.timeScale - (1 / slowMoSpeed * Time.unscaledDeltaTime), 0, 100);
Time.fixedDeltaTime = 0.02F * Time.timeScale;
yield return null;
}
Time.timeScale = CurrentTime = slowMoTimeScale;
SlowTime_C = null;
}
IEnumerator RestartTime()
{
while (Time.timeScale < 1)
{
Time.timeScale += 1 / slowMoSpeed * Time.unscaledDeltaTime;
yield return null;
}
Time.timeScale = CurrentTime = 1;
SlowTime_C = null;
}
[ContextMenu("Create Inputs")]
protected void CreateInputs()
{
#if UNITY_EDITOR
MInput input = GetComponent<MInput>();
if (input == null)
input = gameObject.AddComponent<MInput>();
input.IgnoreOnPause.Value = false;
#region Open Close Input
var OpenCloseInput = input.FindInput("Freeze");
if (OpenCloseInput == null)
{
OpenCloseInput = new InputRow("Freeze", "Freeze", KeyCode.Escape, InputButton.Down, InputType.Key);
input.inputs.Add(OpenCloseInput);
UnityEditor.Events.UnityEventTools.AddPersistentListener(OpenCloseInput.OnInputDown, Freeze_Game);
}
#endregion
#region Submit Input
var Submit = input.FindInput("Pause Editor");
if (Submit == null)
{
Submit = new InputRow("Pause Editor", "Pause Editor", KeyCode.P, InputButton.Down, InputType.Key);
input.inputs.Add(Submit);
UnityEditor.Events.UnityEventTools.AddPersistentListener(Submit.OnInputDown, PauseEditor);
}
#endregion
#region ChangeLeft Input
var ChangeLeft = input.FindInput("SlowMo");
if (ChangeLeft == null)
{
ChangeLeft = new InputRow("SlowMo", "SlowMo", KeyCode.Mouse2, InputButton.Down, InputType.Key);
input.inputs.Add(ChangeLeft);
UnityEditor.Events.UnityEventTools.AddPersistentListener(ChangeLeft.OnInputDown, Slow_Motion);
}
#endregion
UnityEditor.EditorUtility.SetDirty(this);
UnityEditor.EditorUtility.SetDirty(input);
#endif
}
}
}