unity3D赛车游戏的加速场,c#
acceleration-field for unity3D racing game, c#
对于摩托车赛车游戏,我希望赛道的某些部分可以提高摩托车的速度。
我有一个 public 速度浮点数,它在检查器中显示速度。
我添加了一个带有 Collider 的平面,它是一个触发器并且有标签 "speedfield"
现在我想,附在下面的 motorcyclescript 上的一些简单代码就可以做到:
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;
}
}
}
确保满足此清单中的所有项目:
- 摩托车有一个
Rigidbody
组件。
- 这架飞机没有
Rigidbody
组件(它没用,而且会减慢速度)。
- 飞机的
Mesh Collider
有Convex
和isTrigger
设置为true
。
OnTriggerEnter
方法在摩托车脚本中。
- 平面触发器的厚度足够宽:如果摩托车速度太高,它可以穿过平面而物理引擎无法注册触发器。
- 如果是这种情况,尝试将摩托车
Rigidbody
的Collision Detection
设置为Continuous
and/or稍微减少Fixed Timestep
的时间项目设置。
问题很可能是由于最后两个要点引起的。
您正在覆盖速度变量:
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;
}
}
对于摩托车赛车游戏,我希望赛道的某些部分可以提高摩托车的速度。
我有一个 public 速度浮点数,它在检查器中显示速度。
我添加了一个带有 Collider 的平面,它是一个触发器并且有标签 "speedfield" 现在我想,附在下面的 motorcyclescript 上的一些简单代码就可以做到:
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;
}
}
}
确保满足此清单中的所有项目:
- 摩托车有一个
Rigidbody
组件。 - 这架飞机没有
Rigidbody
组件(它没用,而且会减慢速度)。 - 飞机的
Mesh Collider
有Convex
和isTrigger
设置为true
。 OnTriggerEnter
方法在摩托车脚本中。- 平面触发器的厚度足够宽:如果摩托车速度太高,它可以穿过平面而物理引擎无法注册触发器。
- 如果是这种情况,尝试将摩托车
Rigidbody
的Collision Detection
设置为Continuous
and/or稍微减少Fixed Timestep
的时间项目设置。
问题很可能是由于最后两个要点引起的。
您正在覆盖速度变量:
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;
}
}