You can not 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.2 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEngine.UI;
public class TimeScaleWindow : EditorWindow
{
// Add menu named "My Window" to the Window menu
private int weightedTimeScale = 1;
private bool isPaused = false;
private Color defaultColor;
[MenuItem("Tools/TimeScale")]
static void Init()
{
// Get existing open window or if none, make a new one:
TimeScaleWindow window = (TimeScaleWindow)EditorWindow.GetWindow(typeof(TimeScaleWindow),false,"Time Scale");
Rect rect = window.position;
rect.width = 300;
rect.height = EditorGUIUtility.singleLineHeight * 4;
window.minSize = new Vector2(rect.width, rect.height);
window.maxSize = new Vector2(rect.width, rect.height);
window.position = rect;
window.Show();
}
void OnGUI()
{
GUILayout.BeginHorizontal();
if (GUILayout.Button("<<")) NextPower(-1);
if (GUILayout.Button("<")) weightedTimeScale--;
if (GUILayout.Button(">")) weightedTimeScale++;
if (GUILayout.Button(">>")) NextPower(1);
GUILayout.EndHorizontal();
weightedTimeScale = (int)GUILayout.HorizontalSlider(weightedTimeScale, -98f, 100f);
weightedTimeScale = Mathf.Clamp(weightedTimeScale,-98,100);
GUILayout.Space(EditorGUIUtility.singleLineHeight);
GUILayout.BeginHorizontal();
if (GUILayout.Button("Pause")) isPaused = true;
var centeredStyle = new GUIStyle(EditorStyles.label);
centeredStyle.alignment = TextAnchor.UpperCenter;
centeredStyle.normal.textColor = EditorStyles.label.normal.textColor;
if (isPaused)
centeredStyle.normal.textColor = Color.red;
GUILayout.Label(DisplayString(weightedTimeScale), centeredStyle);
if (GUILayout.Button("Play")) isPaused = false;
GUILayout.EndHorizontal();
Time.timeScale = ConvertWeightedToRaw(weightedTimeScale);
}
private float ConvertWeightedToRaw(float input)
{
if (isPaused)
return 0;
if (input >= 1)
return Mathf.Lerp(0, 100, input / 100);
else
return 1 / (-input + 2);
}
private void NextPower(int dir)
{
int sign = (int)Mathf.Sign(weightedTimeScale - 1);
int prevValue = (sign >= 0) ? Mathf.Abs(weightedTimeScale) : Mathf.Abs(weightedTimeScale) + 2;
int nextValue = Mathf.NextPowerOfTwo(prevValue);
if (weightedTimeScale == 0)
{
weightedTimeScale = 1;
if (dir < 0)
weightedTimeScale = -2;
return;
}
if (Mathf.Sign(dir) != Mathf.Sign(weightedTimeScale))
nextValue /= 2;
else if (prevValue == nextValue)
nextValue = Mathf.NextPowerOfTwo(prevValue + 1);
if (sign <= 0)
nextValue -= 2;
weightedTimeScale = nextValue * sign;
}
private string DisplayString(float input)
{
string retVal = "";
if (isPaused)
retVal += "(Paused) ";
if (input > 0)
retVal += input.ToString();
else
retVal += "1/" + (-input + 2);
return retVal;
}
}