WaitForSeconds不起作用
本文关键字:不起作用 WaitForSeconds | 更新日期: 2023-09-27 18:13:56
我有一个改变玩家速度的类。下面是代码:
using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour {
public int multiplier = 2;
public Controls player;
bool flag = false;
void OnTriggerExit(Collider c){
if(c.tag == "Player"){
player = c.gameObject.GetComponent<Controls>();
if(!flag){
multiplySpeed();
StartCoroutine(powerUp());
}
flag = true;
}
}
public IEnumerator powerUp(){
yield return new WaitForSeconds(10);
backToNormal ();
StopCoroutine(powerUp ());
}
public void multiplySpeed(){
player.speed = player.speed * multiplier;
}
public void backToNormal(){
player.speed = player.speed/ multiplier;
}
}
我有两个问题,第一个是在启动协程并将标志变量设置为true之后,再次调用方法OnTriggerExit
,并且标志为false并且再次执行所有内容。第二个问题是方法backToNormal
似乎从未执行过,它只是将速度乘以,并且从未将其恢复正常。如有任何帮助,不胜感激。
编辑:在尝试了Lasse kl
using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour {
public int multiplier = 2;
public Controls player;
bool flag = false;
float timer = 5.0f;
void update(){
timer -= Time.deltaTime;
if (timer == 0) {
backToNormal();
timer = -1f;
}
}
void OnTriggerExit(Collider c){
if(c.tag == "Player"){
player = c.gameObject.GetComponent<Controls>();
if(!flag){
timer = 5.0f;
flag = true;
multiplySpeed();
}
}
}
public void multiplySpeed(){
player.speed = player.speed * multiplier;
}
public void backToNormal(){
player.speed = player.speed/ multiplier;
}
}
但是我也有同样的问题
尝试使用这个脚本:
using UnityEngine;
using System.Collections;
using UnityEngine;
using System.Collections;
public class MultiplySpeed : MonoBehaviour
{
public int multiplier = 2;
public Controls player;
bool flag = false;
float timer = 5.0f;
bool countDown = false;
void update()
{
if (countDown)
{
timer -= Time.deltaTime;
if (timer <= 0)
{
backToNormal();
countDown = false;
}
}
}
void OnTriggerExit(Collider c)
{
if (c.tag == "Player")
{
player = c.gameObject.GetComponent<Controls>();
if (!flag)
{
countDown = true;
timer = 5.0f;
flag = true;
multiplySpeed();
}
}
}
public void multiplySpeed()
{
player.speed = player.speed * multiplier;
}
public void backToNormal()
{
player.speed = player.speed / multiplier;
}
}
如果你想在特定时间(5秒)内改变玩家的速度,那么我就会采取相反的方法。我不会在能量道具内部做计时——因为我认为它应该在玩家击中它后立即被摧毁——我会根据玩家附带的脚本来做。下面的代码应该可以工作:
using UnityEngine;
public class SpeedBoostPowerUp : MonoBehaviour
{
private void OnTriggerEnter(Collider c)
{
if(c.tag == "Player")
{
Destroy(gameObject);
}
}
}
然后你可以在移动组件(Controls.cs)中添加速度提升代码。您可以这样做(我不想更改太多代码):
// INSIDE CONTROLS COMPONENT
private void OnTriggerEnter(Collider c)
{
if(c.tag == "SpeedBoostPowerUp")
{
if (!flag)
{
StartCorouting(BoostSpeed);
}
}
}
public void MultiplySpeed()
{
this.speed = this.speed * this.multiplier;
}
public void BackToNormal()
{
this.speed = this.speed / this.multiplier;
}
private IEnumerator BoostSpeed()
{
flag = true;
MultiplySpeed();
yield return new WaitForSeconds(5);
BackToNormal();
flag = false;
}
当然,你需要用"SpeedBoostPowerUp"标签来标记你的游戏对象。使用了旗子,所以你不能一次有多个速度提升。如果你使用的是"静态"能量道具,也就是具有固定行为的能量道具,那么这种方法就会很有效。如果你想给玩家一个随机的提升等等,如果它碰到了能量提升——比如在《马里奥赛车》中——我会以不同的方式来构建它。但是我猜这对于你想要达到的目标来说太复杂了。
注意:我不会通过speed = speed/multiplier返回正常速度,而是在乘以它之前使用一个变量来存储速度,因为它应该更不容易出错。像这样:
private float speedBeforeBoost;
public void MultiplySpeed()
{
this.speedBeforeBoost = this.speed;
this.speed *= this.multiplier;
}
public void BackToNormal()
{
this.speed = this.speedBeforeBoost;
}