如果 C# 中的条件无法在 Unity 中使用 Time.time 正常工作
If condition in C# not working properly with Time.time in Unity
我为一个对象编写了代码,该对象通过按 space 栏来实例化。现在,我还希望它每十秒出现一次。所以,我写了这段代码-
public class Player : MonoBehaviour
{
[SerializeField]
private GameObject _laserPrefab;
[SerializeField]
private float _fireRate=10.0f;
private float nextFire=0f;
// Start is called before the first frame update
void Start()
{
transform.position=new Vector3(0,0,0);
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && (Time.time>nextFire)){
nextFire=Time.time+_fireRate;
Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
}
}
这段代码在每次按下 space 条时实例化对象,但它没有给出我想要的 10 秒间隔。
Input.GetKeyDown()
只有 return 在检测到按键按下的帧中为真。
它不会 return 为真,直到用户释放键并再次按下它。
我认为你可以使用 Input.GetKey()
来实现你想要的。
在这种情况下,您不能 Time.time
,因为您没有一直按住该键。在这种情况下,您可能希望使用 Time.deltaTime
来计算自对象实例化以来经过的时间。
所以,在Update()
函数中,不断更新nextFire
,当对象被实例化时,将其重置为0。
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && (nextFire > _fireRate)){
nextFire = 0;
Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
}
nextFire += time.DeltaTime;
}
当对象被实例化时,nextFire
会重置并在每一帧增加自身。一旦该值达到 10 秒(等于 _fireRate
),就可以实例化另一个对象。
我为一个对象编写了代码,该对象通过按 space 栏来实例化。现在,我还希望它每十秒出现一次。所以,我写了这段代码-
public class Player : MonoBehaviour
{
[SerializeField]
private GameObject _laserPrefab;
[SerializeField]
private float _fireRate=10.0f;
private float nextFire=0f;
// Start is called before the first frame update
void Start()
{
transform.position=new Vector3(0,0,0);
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && (Time.time>nextFire)){
nextFire=Time.time+_fireRate;
Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
}
}
这段代码在每次按下 space 条时实例化对象,但它没有给出我想要的 10 秒间隔。
Input.GetKeyDown()
只有 return 在检测到按键按下的帧中为真。
它不会 return 为真,直到用户释放键并再次按下它。
我认为你可以使用 Input.GetKey()
来实现你想要的。
在这种情况下,您不能 Time.time
,因为您没有一直按住该键。在这种情况下,您可能希望使用 Time.deltaTime
来计算自对象实例化以来经过的时间。
所以,在Update()
函数中,不断更新nextFire
,当对象被实例化时,将其重置为0。
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && (nextFire > _fireRate)){
nextFire = 0;
Instantiate(_laserPrefab,transform.position+new Vector3(0,1f,0),Quaternion.identity);
}
nextFire += time.DeltaTime;
}
当对象被实例化时,nextFire
会重置并在每一帧增加自身。一旦该值达到 10 秒(等于 _fireRate
),就可以实例化另一个对象。