private void SetupParameters() { BodyMeshRendere.material.color = StaticGameHelper.GetRandomColor(); MinTurnTime = Random.Range(1.0f, 4.0f); MaxTurnTime = MinTurnTime + Random.Range(1.0f, 4.0f); TurnTimer = Random.Range(MinTurnTime, MaxTurnTime); MovementSpeed = Random.Range(3.0f, 6.0f); TargetDirection = new Vector3(Random.Range(-1.0f, 1.0f), 0, Random.Range(-1.0f, 1.0f)); }
void FixedUpdate() { if (CarController == null || !CanMove) { return; } float dist = (Data.GetKey(TargetKeyIndex) - CarController.transform.position).magnitude; if (dist < 1.0f) { TargetKeyIndex = (TargetKeyIndex + 1) % Data.Keys.Count; } float motor = 0; float steering = 0; Vector3 targetVector = Data.GetKey(TargetKeyIndex) - CarController.transform.position; Vector3 forwardVector = CarController.transform.forward; float targetAngle = (float)StaticGameHelper.AngleBetweenVectors(targetVector, forwardVector); float maxAngle = CarController.GetMaxSteeringAngle(); if (targetAngle < maxAngle && targetAngle > -maxAngle) { motor = 1; steering = targetAngle / maxAngle; } else { if (targetAngle > maxAngle) { motor = 1 - (targetAngle - maxAngle) / (180 - maxAngle) * 0.5f; steering = 1; } else if (targetAngle < -maxAngle) { steering = -1; motor = 1 - (targetAngle + maxAngle) / (-180 + maxAngle) * 0.5f; } } CarController.UpdateInput(motor * Data.MotorMultiplier, steering * Data.WheelMultiplier); }
public void UpdateInput(float motor, float steering) { motor *= MaxMotorTorque; steering *= MaxSteeringAngle; double angle = StaticGameHelper.AngleBetweenVectors(RigidBody.velocity, RigidBody.transform.forward); bool isMovingForward = angle <90 && angle> -90; foreach (SimpleAxleData axle in Axels) { if (axle.Steering) { axle.LeftWheel.steerAngle = steering; axle.RightWheel.steerAngle = steering; } if (Break) { axle.LeftWheel.brakeTorque = BreakForce; axle.RightWheel.brakeTorque = BreakForce; axle.LeftWheel.motorTorque = 0; axle.RightWheel.motorTorque = 0; } else if (isMovingForward) { if (motor >= 0) { if (axle.Motor) { axle.LeftWheel.motorTorque = motor; axle.RightWheel.motorTorque = motor; } if (axle.Breaks) { axle.LeftWheel.brakeTorque = 0; axle.RightWheel.brakeTorque = 0; } } else { if (axle.Breaks) { axle.LeftWheel.brakeTorque = BreakForce; axle.RightWheel.brakeTorque = BreakForce; } if (axle.Motor) { axle.LeftWheel.motorTorque = 0; axle.RightWheel.motorTorque = 0; } } } else { if (motor > 0) { if (axle.Breaks) { axle.LeftWheel.brakeTorque = BreakForce; axle.RightWheel.brakeTorque = BreakForce; } if (axle.Motor) { axle.LeftWheel.motorTorque = 0; axle.RightWheel.motorTorque = 0; } } else { if (axle.Motor) { axle.LeftWheel.motorTorque = motor * 0.5f; axle.RightWheel.motorTorque = motor * 0.5f; } if (axle.Breaks) { axle.LeftWheel.brakeTorque = 0; axle.RightWheel.brakeTorque = 0; } } } ApplyLocalPositionToVisuals(axle.LeftWheel, axle.LeftWheelTransform); ApplyLocalPositionToVisuals(axle.RightWheel, axle.RightWheelTransform); } }