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.
51 lines
1.3 KiB
C#
51 lines
1.3 KiB
C#
6 months ago
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using UnityEngine;
|
||
|
|
||
|
public class DynamicTimestepSetter : MonoBehaviour {
|
||
|
|
||
|
public float slowestTimestep = 1 / 50f;
|
||
|
public float fastestTimestep = 1 / 144f;
|
||
|
|
||
|
float[] deltaTimeList = new float[10];
|
||
|
Coroutine slowUpdateRounte = null;
|
||
|
int id;
|
||
|
|
||
|
private void OnEnable() {
|
||
|
if(slowUpdateRounte != null)
|
||
|
StopCoroutine(slowUpdateRounte);
|
||
|
|
||
|
slowUpdateRounte = StartCoroutine(SlowUpdate());
|
||
|
GameObject.DontDestroyOnLoad(gameObject);
|
||
|
}
|
||
|
|
||
|
private void OnDisable() {
|
||
|
if(slowUpdateRounte != null)
|
||
|
StopCoroutine(slowUpdateRounte);
|
||
|
}
|
||
|
|
||
|
IEnumerator SlowUpdate() {
|
||
|
while(gameObject.activeInHierarchy) {
|
||
|
|
||
|
deltaTimeList[id] = Time.deltaTime;
|
||
|
id = (++id) % deltaTimeList.Length;
|
||
|
Time.fixedDeltaTime = Mathf.Clamp(AverageDelta(), fastestTimestep, slowestTimestep);
|
||
|
yield return new WaitForSecondsRealtime(0.02f);
|
||
|
}
|
||
|
|
||
|
slowUpdateRounte = null;
|
||
|
}
|
||
|
|
||
|
public float AverageDelta() {
|
||
|
float averageVelocity = 0;
|
||
|
if(deltaTimeList.Length > 0) {
|
||
|
foreach(var deltaTime in deltaTimeList) {
|
||
|
averageVelocity += deltaTime;
|
||
|
}
|
||
|
averageVelocity /= deltaTimeList.Length;
|
||
|
}
|
||
|
|
||
|
return averageVelocity;
|
||
|
}
|
||
|
}
|