要求实现动态生成管道,一直没有想到比较好的方法,之前跟着教程做的时候也用到了Time类,这次又详细查了查,总算解决了问题。
1.Time.time
此帧开始的时间(只读)。这是以秒计算到游戏开始的时间。也就是说,从游戏开始到到现在所用的时间。
当在MonoBehaviour的FixedUpdate里调用的时候,返回的是fixedTime属性。
// Instantiates a projectile off every 0.5 seconds,
// if the Fire1 button (default is ctrl) is pressed.
//如果Fire1按钮被按下(默认为ctrl),每0.5秒实例化一发子弹
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public GameObject projectile;
public float fireRate = 0.5F;
private float nextFire = 0.0F;
void Update() {
if (Input.GetButton("Fire1") && Time.time > nextFire) {
nextFire = Time.time + fireRate;
duck clone = Instantiate(projectile, transform.position, transform.rotation);
}
}
}
2.Time.deltaTime
以秒计算,完成最后一帧的时间(只读)。使用这个函数使和你的游戏帧速率无关。
放在Update()函数中的代码是以帧来执行的.如果我们需要物体的移动以秒来执行.我们需要将物体移动的值乘以Time.deltaTime。
如果你加或减一个每帧改变的值,你应该与Time.deltaTime相乘。当你乘以Time.deltaTime实际表示:每秒移动物体10米,而不是每帧10米。
当从MonoBehaviour的FixedUpdate里调用时,返回固定帧速率增量时间(fixedDeltaTime)。
请注意从OnGUI里你不应该依赖于Time.deltaTime,因为OnGUI可以在每帧被多次调用并且每个调用deltaTime将持有相同的值,直到下一帧再次更新。(确实不能这么用)
//move the object 10 meters per socond.
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
void Update() {
float translation = Time.deltaTime * 10;
transform.Translate(0, 0, translation);
}
}
最近的FixedUpdate已开始的时间(只读)。这是以秒计自游戏开始的时间。固定时间以定期间隔更新(相当于fixedDeltaTime)直到达到time属性。
4.Time.fixedDeltaTime
以秒计间隔,在物理和其他固定帧速率进行更新(像MonoBehaviour的FixedUpdate)。
为读取增量时间建议使用Time.deltaTime,因为如果你是在FixedUpdate函数或Update函数里,它自动返回正确的增量时间。
请注意fixedDeltaTime时间间隔是有关在游戏的时间受timeScale的影响。
其实就是一个数数,开始的时候用for循环写的真是心碎碎的,最后用的Time.time,这段是每隔一秒逐个消失:
void Update () {
<span style="white-space:pre"> </span>if(flag == true)
{
while(i < objPipe.Length && Time.time > timer)
{
timer = Time.time + appearRate;
objPipe[i].SetActive (false);
Debug.Log(i);
i++;
}
}
}
在GUI里果然用Time会混乱,只好设置一个标志位flag。
另:搜到一个现实游戏FPS的方法,make一下:
using UnityEngine;
using System.Collections;
public class showFps : MonoBehaviour {
private float frames = 0f;
private float updateInterval = 0.5f;
private string fps;
private float accum = 0f;
private float timeLeft;
void Start () {
timeLeft = updateInterval;
}
void Update () {
timeLeft -= Time.deltaTime;
accum += Time.timeScale / Time.deltaTime;
++frames;
if(timeLeft <= 0f)
{
fps = (accum/frames).ToString("f2");
timeLeft = updateInterval;
accum = 0.0f;
frames = 0;
}
}
void OnGUI()
{
GUI.Box(new Rect(20,80,100,20),"FPS:"+fps);
}
}