今天来总结下Unity自带的一些可以操控时间的方法。
1、Time.time。比较常用计算运行时间而触发特定事件。
public class Controller : MonoBehaviour
{
public float eventTime = 5f; // 触发事件的时间
private float startTime; // 游戏开始的时间
private void Start()
{
startTime = Time.time; // 记录游戏开始的时间
}
private void Update()
{
if (Time.time - startTime >= eventTime)
{
// 达到触发事件的时间,执行特定事件
DoSomething();
}
}
private void DoSomething()
{
// 特定事件
Debug.Log("Event triggered!");
}
}
2、Time.deltaTime,参考这篇笔记:关于Unity Time.deltaTime的理解和使用-CSDN博客
3、WaitForSeconds,协程。延时最适合。
public class Controller : MonoBehaviour
{
private void Start()
{
StartCoroutine(DelayCoroutine());
}
private IEnumerator DelayCoroutine()
{
yield return new WaitForSeconds(1f);
Debug.Log("我延迟了1秒");
}
}
4、Time.timeScale,这个属性可用于控制游戏的时间流逝速度。将其设置为1表示正常速度,大于1表示加速,小于1表示减速,设置为0表示暂停。如下面模拟加减速的一个案例:
using UnityEngine;
using UnityEngine.UI;
public class Controller : MonoBehaviour
{
public float accelerationTime = 1f; // 加速时间
public float decelerationTime = 1f; // 减速时间
public float pauseTime = 1f; // 暂停时间
public Image image; // 图片对象
private float targetTimeScale = 1f; // 目标时间缩放值
private float currentTimeScale = 1f; // 当前时间缩放值
private float timeScaleVelocity; // 时间缩放值的变化速度
private float rotationSpeed = 500f; // 图片旋转速度
private int currentState = 0; // 当前状态,0表示加速,1表示减速,2表示暂停
private float stateTimer = 0f; // 状态计时器
private void Update()
{
// 根据目标时间缩放值逐渐调整当前时间缩放值
currentTimeScale = Mathf.SmoothDamp(currentTimeScale, targetTimeScale, ref timeScaleVelocity, GetTimeScaleChangeDuration());
// 应用当前时间缩放值
Time.timeScale = currentTimeScale;
// 根据当前时间缩放值调整图片的旋转角度
image.rectTransform.Rotate(Vector3.forward, rotationSpeed * Time.deltaTime * currentTimeScale);
// 更新状态计时器
stateTimer += Time.deltaTime;
// 根据当前状态和状态计时器切换目标时间缩放值
switch (currentState)
{
case 0: // 加速状态
if (stateTimer >= accelerationTime)
{
stateTimer = 0f;
targetTimeScale = 0.5f; // 切换到减速状态
currentState = 1;
}
break;
case 1: // 减速状态
if (stateTimer >= decelerationTime)
{
stateTimer = 0f;
targetTimeScale = 0f; // 切换到暂停状态
currentState = 2;
}
break;
case 2: // 暂停状态
if (stateTimer >= pauseTime)
{
stateTimer = 0f;
targetTimeScale = 2f; // 切换到加速状态
currentState = 0;
}
break;
}
}
private float GetTimeScaleChangeDuration()
{
if (targetTimeScale > currentTimeScale)
{
return accelerationTime; // 如果目标时间缩放值大于当前时间缩放值,则返回加速时间
}
else
{
return decelerationTime; // 如果目标时间缩放值小于当前时间缩放值,则返回减速时间
}
}
}
Unity模拟加减速_哔哩哔哩_bilibili
5、Time.fixedDeltaTime,物理模拟的固定时间步长。
在Project Settings中Time的Fixed Timestep可设置它的值。
Time.fixedDeltaTime跟Time.deltaTime最大的区别是Time.fixedDeltaTime不受帧率影响,它的时间是固定的。