|
|
- 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;
-
- [MenuItem("AddOn/TimeScale")]
- static void Init()
- {
- // Get existing open window or if none, make a new one:
- TimeScaleWindow window = (TimeScaleWindow)EditorWindow.GetWindow(typeof(TimeScaleWindow));
- window.Show();
- }
-
- void OnGUI()
- {
- GUILayout.Label("Base Settings", EditorStyles.boldLabel);
-
- 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.BeginHorizontal();
-
- if (GUILayout.Button("Pause")) isPaused = true;
- var centeredStyle = GUI.skin.GetStyle("Label");
- centeredStyle.alignment = TextAnchor.UpperCenter;
- centeredStyle.normal.textColor = Color.black;
-
- 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;
- }
-
- }
|