我正在尝试像这样降低击球频率:
public class createShot : MonoBehaviour {
public GameObject shot;
void Update()
{
StartCoroutine("Shot");
}
IEnumerator Shot()
{
if (Input.GetKey("space"))
{
Instantiate(shot, transform.position, transform.rotation);
yield return new WaitForSeconds(1f);
}
}
}
但是它可以在不到一秒钟的时间内发送大量照片……有人可以帮忙吗?这是Unity5中的2D项目
答案 0 :(得分:3)
也许您想要更多类似这样的东西:
float elapsedTime;
[SerializeField]
float targetTime = 1f;
void Update()
{
elapsedTime += Time.deltaTime;
if(elapsedTime >= targetTime && Input.GetKey(KeyCode.Space))
{
elapsedTime = 0;
Instantiate(shot, transform.position, transform.rotation);
}
}
这将增加计时器elapsedTime
,并检查计时器是否超过了targetTime
。
我也鼓励您尽可能停止使用字符串。在调用方法或请求类似GetKey中的键的方法时,请勿使用它们。它们会产生垃圾并降低您的软件速度。
答案 1 :(得分:1)
使用已经编写的完全相同的代码,我们可以进行一些细微调整,使一切正常。
<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[(EventID=4624)]]
and *[EventData[Data[@Name='LogonType'] and (Data=1 or Data=8 or Data=9)]]
</Select>
<Suppress Path="Security">
*[EventData[Data[@Name='TargetUserName'] and (Data='SYSTEM')]]
</Suppress>
</Query>
</QueryList>
顺便说一句,您应该始终使用前导大写字母来命名课程,例如public class createShot : MonoBehaviour {
public GameObject shot;
void Start() //create the coroutine once
{
StartCoroutine("Shot");
}
IEnumerator Shot()
{
while(true) { //do this forever!
//This is what makes it loop and what allows the WaitForSeconds() do its job
if (Input.GetKey("space"))
{
Instantiate(shot, transform.position, transform.rotation);
yield return new WaitForSeconds(1f);
}
else {
yield return null; //wait 1 frame instead
}
}
}
}
而不是CreateShot
。