Поле ускорения для гоночной игры Unity3D, C#
Для игры в мотогонки я хочу, чтобы некоторые части трассы увеличивали скорость мотоцикла.
У меня есть публичное плавание для скорости, которая показывает скорость в инспекторе.
Я добавил самолет с коллайдером, который является триггером и имеет тег "поле скорости". Теперь я подумал, что некоторый простой код, прикрепленный к приведенному ниже мотоциклу, сделает это:
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;
}
}
}
2 ответа
Решение
Вы переопределяете переменную скорости:
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;
}
}
Убедитесь, что все пункты в этом контрольном списке удовлетворены:
- Мотоцикл имеет
Rigidbody
составная часть. - Самолет не имеет
Rigidbody
компонент (это бесполезно, и это может замедлить ход событий). Mesh Collider
самолета имеетConvex
а такжеisTrigger
установлен вtrue
,OnTriggerEnter
Метод в мотоциклетном скрипте.- Толщина триггера самолета достаточно широка: если скорость мотоцикла слишком высока, он может проехать через самолет без физического движка, способного зарегистрировать триггер.
- Если это так, попробуйте установить
Collision Detection
мотоциклаRigidbody
вContinuous
и / или несколько уменьшитьFixed Timestep
в настройках проекта Time.
Скорее всего, проблема связана с двумя последними пунктами.