我现在使用C#在Unity上进行2D射击游戏,我希望在获得加电项目时将船速提高5秒。它有点工作,但是当船舶上电时,直到按钮被释放并再次按下之前,火速不会改变。即使按下按钮,有没有办法在加电后立即改变火速?此外,上电功能是我想出的,如果有更好的方法来启动上电功能,这也将非常有用。在此先感谢:)
void Update(){
if (Input.GetKeyDown(KeyCode.Space)){
InvokeRepeating("Fire", 0.000001f, fireRate);
}
}
void PowerUp()
{
Upgrade = true;
timeLeft = +5f;
if (Upgrade == true)
{
fireRate = 0.1f;
}
if (timeLeft <= 0)
{
Upgrade = false;
fireRate = 0.5f;
}
}
答案 0 :(得分:1)
您应该将引用类型传递给Fire
协程而不是float
fireRate。
只需将fireRate
包装在一个类中就可以了:
class FireData
{
public float fireRate = 0.1;
}
然后在你的脚本中,
FireData fireData = new FireData { fireRate = 0.5f };
void Update(){
if (Input.GetKeyDown(KeyCode.Space)){
InvokeRepeating("Fire", 0.000001f, fireData);
}
}
void PowerUp()
{
Upgrade = true;
timeLeft = +5f;
if (Upgrade == true)
{
fireData.fireRate = 0.1f;
}
if (timeLeft <= 0)
{
Upgrade = false;
fireData.fireRate = 0.5f;
}
}
在Fire()
协程中,使用此fireData.fireRate
获取fireRate。
顺便说一句,我认为你的上电功能足够好了。
但是使用协程的方式不正确。不要多次在同一个函数上调用InvokeRepeating
。
if (Input.GetKeyDown(KeyCode.Space)){
InvokeRepeating("Fire", 0.000001f, fireRate);
}
相反,您应该使用bool值来控制火灾何时开始。
if (Input.GetKeyDown(KeyCode.Space)){
fireData.Firing = true;
}
if(fireData.Firing)
{
InvokeRepeating("Fire", 0.000001f, fireRate);
}
另请记住添加一个逻辑以通过StopCoroutine
停止触发。