今天整理了Time类!
+一张很有意思的理解API的图
(此图灵感来源于 如何理解API,API 是如何工作的_仁杰兄的博客-CSDN博客_api)
目录
*在Update每帧执行的方法中,个别语句实现指定间隔执行一次
Time
Time.time以秒计算,从游戏开始的时间
Time.deltaTime 每帧消耗的时间(每帧的时间间隔)
Public void Update()//渲染更新
{ 在渲染帧中做速度恒定的移动、旋转
//每渲染帧执行一次,旋转一度
//帧多 —>1秒旋转速度快 希望1帧旋转量小
//帧少 —>1秒旋转速度慢 希望1帧旋转量大
This.transform.Rotate(0,1*Time.deltaTime,0)
}
旋转速度*每帧消耗时间,可以保证旋转速度不受渲染影响
或者
public void FixedUpdate()//物理更新
{
this.transform.Rotate(0,1,0);
)
Time.timeScale受缩放影响的每帧间隔
Time.timeScale=0游戏暂停 Time.timeScale=1继续游戏
物体在FixedUpdate()移动,点“暂停”、“继续”都好使
(即便Time.timeScale没有在FixedUpdate()里)
因为FixedUpdate()固定时间执行一次,与渲染无关,受Time.timeScale影响
在Update()里不好使,因为Update()渲染场景时执行,不受Time.timeScale影响,但Time.deltaTime会受到Time.timeScale影响
需求:游戏暂停以后,个别物体不受影响
在Updete中做
用this.transform.Rotatel(0,1*Time.unscaledDeltaTime,0)
Time.unscaledDeltaTime 不受缩放影响的每帧间隔
练习:使用Text制作倒计时预制体
从02:00开始,最后10秒字体为红色,时间为00:00后停止
最后10秒字体为红色—>
Hierachy右键—>UI—>Text
引用using UnityEngine.UI;
If(second<=0)
txtTimer.color=Color.red;
时间为00:00后停止—>
If(second<=0)
CancelInvoke(“Timer”)//取消调用某个方法
思路:
1.查找组件引用
2.定义变量:秒
3.120—>02:00
119—>01:59
4.修改文本
5.如何每秒修改一次
*在Update每帧执行的方法中,个别语句实现指定间隔执行一次
方法一:Time.time
private float nextTime = 1;//下次修改时间
private void Update()
{
if (Time.time >= nextTime)
{
second--;
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second <= 10)
txtTimer.color = Color.red;
//设置下次修改时间
nextTime = Time.time + 1;//每隔一秒执行一次
}
}
适合做发射子弹,按左键就发射,之后蓄力(等待时间)限制频率
方法二:Time.deltaTime
private float totalTime;//累计每帧的间隔
private void Update()
{
totalTime += Time.deltaTime;
if (totalTime >= 1)
{
second--;
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
totalTime = 0;
}
}
先等待后做事
方法三:InvokeRepeating()
//重复调用(被执行的方法名称,第一次执行时间,每次执行间隔)
void Start()
{
InvokeRepeating("Timer", 1, 1);
}
private void Timer()
{
second--;
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
}
Invoke(被执行的方法,开始调用的时间)
代码实现:
using System.Collections;
using System.Collections.Generic;
using UnityEngine ;
using UnityEngine.UI;
public class TimeDemo : MonoBehaviour
{
private Text txtTimer;
public int second = 120;
private float nextTime = 1;//下次修改时间
void Start()
{
txtTimer = this.GetComponent<Text>();
}
private void Update()
{
Timer1();
}
void Timer1()
{
if (Time.time >= nextTime)
{
second--;
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second <= 10)
txtTimer.color = Color.red;
//设置下次修改时间
nextTime = Time.time + 1;
if(second<=0)
{
CancelInvoke("Timer");
}
}
}
}