在unity3d中,我有一个播放器,它以一定的速度不断向前移动,并且只控制它的左或右位置。
我希望我的播放器在遇到对象并启用触发器时立即加快速度。

这是我尝试过的方法,但似乎无法正常工作。有任何想法吗?

void Update ()
{
    GetComponent<Rigidbody>().velocity = new Vector3(Input.GetAxisRaw("Horizontal") * 4, 0, horizVel);
}

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "SpeedUp")
    {
        GetComponent<Rigidbody>().velocity = new Vector3(Input.GetAxisRaw("Horizontal") * 4, 0, horizVel * 10.0f);
    }
}


horizVel是将我的速度设置为10的公共变量。

最佳答案

似乎是因为您已经对速度变量OnTriggerEnter方法进行了硬编码,而不是对其进行更新。

一帧调用一次更新。如果horizVel设置为10,则每帧将以10的速度移动。

当您点击OnTriggerEnter时,您的horizVel更新为以前的10倍,即:100。

但是,由于您尚未更新速度变量,因此当您返回到Update方法时,您的horizVel将再次回到10。

我认为您应该尝试的是:

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "SpeedUp")
    {
         horizVel *= 10f;
    }
}


这样,您的速度变量将仅在碰撞期间保持INSTEAD之前的10倍。

编辑
“我尝试过,但不仅在碰撞期间速度仍得到提高”

然后,您可以使用协程将速度变量重置回其原始值:

private void OnTriggerEnter(Collider other)
{
    if (other.gameObject.tag == "SpeedUp")
    {
         horizVel *= 10f;
         StartCoroutine(ResetSpeedAfterTime(5f));
    }
}

// Resets the speed variable back to the original value after a set amount of time
private IEnumerator ResetSpeedAfterTime(float time)
{
    yield return new WaitForSeconds(time);
    horizVel = 10f; // the original speed value;
}

关于c# - Unity3d瞬间加快玩家移动速度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50621334/

10-17 00:52