Unity3d瞬间加快了玩家的移动速度

时间:2018-05-31 09:46:05

标签: c# unity3d

在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的公共变量。

3 个答案:

答案 0 :(得分:4)

似乎是因为您已经对您的速度变量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;
}

答案 1 :(得分:1)

如果您只想在物体处于触发范围内时提高速度,则可以在角色离开碰撞器后反转速度。

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

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

答案 2 :(得分:0)

虽然我是C#的初学者,但我的回答可能不正确,但你是否尝试为游戏对象分配一个id,该id应该使角色加速,然后在语句中调用它

  

if(other.gameObject.tag ==&#34; SpeedUp&#34;)

这可能是因为发动机无法计算发生碰撞的确切时刻