|
|
- 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;
- }
-
- }
|