【问题标题】:acceleration-field for unity3D racing game, c#unity3D 赛车游戏的加速场,c#
【发布时间】:2017-06-07 11:04:26
【问题描述】:

对于一个摩托车赛车游戏,我想要赛道的某些部分来提高摩托车的速度。

我有一个速度的公共浮点数,它显示了检查器中的速度。

我添加了一个带有 Collider 的飞机,它是一个触发器并带有标签“speedfield” 现在我想,一些简单的代码,附在下面的摩托车脚本上,就可以做到:

void OnTriggerEnter(Collider other)
{

    if (other.gameObject.CompareTag ("speedfield")) {
        Speed = Speed + 50;
    }
}

但是什么也没发生。我想我在这里遗漏了一些明显的东西。希望你能帮忙!来自德国的问候:)

void FixedUpdate (){

    Inputs();
    Engine();
}

void Inputs (){

    Speed = rigid.velocity.magnitude * 3.6f;

    //Freezing rotation by Z axis.
    transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, 0);

    //If crashed...
    if(!crashed){
        if(!changingGear)
            motorInput = Input.GetAxis("Vertical");
        else
            motorInput = Mathf.Clamp(Input.GetAxis("Vertical"), -1, 0);
        steerInput = Input.GetAxis("Horizontal");
    }else{
        motorInput = 0;
        steerInput = 0;
    }

    //Reverse bool
    if(motorInput < 0  && transform.InverseTransformDirection(rigid.velocity).z < 0) 
        reversing = true;
    else
        reversing = false;

}

void Engine (){

    //Steer Limit.
    SteerAngle = Mathf.Lerp(defsteerAngle, highSpeedSteerAngle, (Speed / highSpeedSteerAngleAtSpeed));
    FrontWheelCollider.steerAngle = SteerAngle * steerInput;

    //Engine RPM.
    EngineRPM = Mathf.Clamp((((Mathf.Abs((FrontWheelCollider.rpm + RearWheelCollider.rpm)) * gearShiftRate) + MinEngineRPM)) / (currentGear + 1), MinEngineRPM, MaxEngineRPM);


    // Applying Motor Torque.
    if(Speed > maxSpeed){
        RearWheelCollider.motorTorque = 0;
    }else if(!reversing && !changingGear){
        RearWheelCollider.motorTorque = EngineTorque  * Mathf.Clamp(motorInput, 0f, 1f) * engineTorqueCurve[currentGear].Evaluate(Speed);
    }

    if(reversing){
        if(Speed < 10){
            RearWheelCollider.motorTorque = (EngineTorque  * motorInput) / 5f;
        }else{
            RearWheelCollider.motorTorque = 0;
        }
    }

}

【问题讨论】:

  • 你能发布你的运动代码吗?我们需要知道您如何使用Speed 变量。
  • 还有脚本附在哪里?
  • OnTriggerEnter 在对象进入脚本附加到的对象中的触发器时触发。我的意思是,你的摩托车有扳机?也许您应该更改脚本,以便将其附加到速度场
  • @Lestat 我试图将脚本附加到速度场,但仍然没有任何反应:'void OnTriggerEnter(Collider other) { if (other.gameObject.CompareTag ("Player")) { GetComponent ().速度 += 50; } }'

标签: unity3d racing


【解决方案1】:

您覆盖速度变量:

void FixedUpdate (){

    Inputs();
    Engine();
}

void Inputs (){

    Speed = rigid.velocity.magnitude * 3.6f;
...
}

改成:

[SerializeField] float speedMultiplier = 3.6f;
[SerializeField] float speedMultiplierChange = 2;

void Inputs (){

        Speed = rigid.velocity.magnitude * speedMultiplier;
    ...
    }

void OnTriggerEnter(Collider other)
{

    if (other.gameObject.CompareTag ("speedfield")) {
        speedMultiplier += speedMultiplierChange; 
    }
}

【讨论】:

  • 谢谢,这很有帮助!但是当我离开速度场时,效果仍然存在。在我离开场地的那一刻,速度应该是正常的。
  • 只需添加一个 OnTriggerExit 方法并在那里更改乘数;)
  • 不知何故,速度值并没有真正影响摩托车。在检查器中,速度会增加,但摩托车并没有变得更快。似乎这增加了检查员的数量,但并没有真正提高速度。我正在寻找错误:)
  • 只需要使用 EngineTorque 而不是 Speed。但是你真的很有帮助。感谢 1000 次 :)
【解决方案2】:

确保满足此清单中的所有项目:

  • 摩托车有一个Rigidbody 组件。
  • 飞机没有Rigidbody 组件(它没用,可能会减慢速度)。
  • 飞机的Mesh ColliderConvexisTrigger 设置为true
  • OnTriggerEnter 方法在摩托车脚本中。
  • 飞机触发器的厚度足够宽:如果摩托车速度太高,它可以通过飞机而物理引擎无法注册触发器。
  • 如果是这种情况,请尝试将摩托车 RigidbodyCollision Detection 设置为 Continuous 和/或在 Time 项目设置中稍微减小 Fixed Timestep

问题很可能是由于最后两个要点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多