我有一个改变播放器速度的课程。这是代码:
$('#main').on('scroll'...
我有两个问题,第一个是在启动协同程序并且flag变量设置为true之后,再次调用方法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;
}
}
,并且标志为false并且所有内容都会再次执行。第二个问题是方法OnTriggerExit
似乎从未被执行过,它只是将速度倍增并且永远不会恢复正常。任何帮助表示赞赏。
编辑: 在尝试了LasseKlüver建议的方法之后,这是我的代码:
backToNormal
但是我有完全相同的问题。
答案 0 :(得分:0)
尝试使用此脚本:
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;
}
}
答案 1 :(得分:0)
如果你想在给定的时间(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;
}
当然,您需要使用&#34; SpeedBoostPowerUp&#34;标记您的游戏对象。标签。使用该标志,因此您不能同时进行多次速度提升。 如果您使用&#34;静态&#34;这应该可以正常工作电源UPS - 具有固定行为的电源UPS。如果你想给玩家一个随机的提升等等,如果它打到电源 - 例如在马里奥卡丁车 - 我会不同的结构。但是这对于你想达到的目标来说太复杂了。
注意:我不会通过 speed = speed / multiplier 恢复到正常速度,而是使用变量来存储速度,然后乘以它,因为它应该更不容易出错。像那样:
private float speedBeforeBoost;
public void MultiplySpeed()
{
this.speedBeforeBoost = this.speed;
this.speed *= this.multiplier;
}
public void BackToNormal()
{
this.speed = this.speedBeforeBoost;
}