unity中计时功能的实现方法总结

tech2025-10-23  4

计时功能在游戏中是最常见不过的了,比如联盟中技能冷却倒计时,枪战类游戏中手枪不能连发,炸弹爆炸的倒计时,我们需要根据不同的需要去编写不同情况下的计时代码。

1.用Time类中的属性

法1:Time.time

描述: 该帧开始的时间(只读)。此为自游戏启动以来的时间(以秒为单位)。 该值更倾向于提供游戏已经运行的时间,而不是每帧的时间。

注意: 在所有 Awake 函数都完成之后,Time.time 便会立即启动。在 Awake 函数期间,将取消定义 time 值。

eg:每隔一秒做某件事。

private float delayTime = 1; private void Update() { if(Time.time >= delayTime) { //你要做的事...... delayTime += Time.time; } }

法2:Time.deltaTime

描述: 完成上一帧所用的时间(以秒为单位)(只读)。此属性提供当前帧和上一帧之间的时间。用这个属性计时误差较大,但也不会很明显。

eg:每隔一秒做某件事。

private float timer = 0; private float delayTime = 1; private void Update() { timer += Time.deltaTime; if(timer >= delayTime) { //你要做的事...... timer = 0; } }

2.InvokeRepeating

public void InvokeRepeating (string methodName, float time, float repeatRate);

描述: 在 time 秒后调用 methodName 方法,然后每 repeatRate 秒调用一次。

注意: 如果将时间刻度设置为 0,该函数不起作用。

eg:每隔一秒做某件事。

void Start() { InvokeRepeating("事件/方法", 1.0f, 1.0f); } void 事件/方法() { //...... }

使用CancelInvoke(string methodName);来终止事件。

3.使用协程:

协程的使用可以看官方脚本手册中的这一节。 这里通过例子来体现,用的是协程中的WaitForSecond方法: eg:倒计时三秒。

private void Start() { StartCoroutine(TimeFunc(3));//开启协程 } private IEnumerator TimeFunc(float TimeCount) { do{ print(TimeCount); yield return new WaitForSecond(1);//在每帧update之后进行等待一秒 TimeCount -= 1; }while(TimeCount > 0) print("时间到"); }

4.动画、视频的播放时间有相应的类及属性去获取

5.最后来一个项目中的应用:

枪口的火花是以动画或者特效形式呈现,但是我们应该只在用户射击时才播放/显示它,并且每次播放完(自己设定的时间)我们都需要停止播放/显示。

public GameObject fireEffect;//开火特效 private float hideTimer;//计时器 public float displayTime = 0.3f;//枪口开火特效播放时间 private void Update { //如果火光启用并到了隐藏时间那么禁用即可。 if(fireEffect.activeInHierarchy && Time.time >= hideTimer) { fireEffect.SetActive(false); } if(Input.GetMouseButtonDown(0))//按下鼠标左键射击 { fireEffect.SetActive(true); hideTimer = Time.time + displayTime; } }
最新回复(0)