5. Учимся ездить
public float rotateOnStandTorque = 1500.0f; //1
public float rotateOnStandBrakeTorque = 500.0f; //2
public float maxBrakeTorque = 1000.0f; //3
void FixedUpdate(){
float accelerate = 0;
float steer = 0;
accelerate = Input.GetAxis("Vertical"); //4
steer = Input.GetAxis("Horizontal"); //4
UpdateWheels(accelerate,steer); //5
}
public void UpdateWheels(float accel,float steer){ //5
float delta = Time.fixedDeltaTime;
float trackRpm = CalculateSmoothRpm(leftTrackWheelData);
foreach (WheelData w in leftTrackWheelData){
w.wheelTransform.localPosition = CalculateWheelPosition(w.wheelTransform,w.col,w.wheelStartPos);
w.boneTransform.localPosition = CalculateWheelPosition(w.boneTransform,w.col,w.boneStartPos);
w.rotation = Mathf.Repeat(w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f);
w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.startWheelAngle.y, w.startWheelAngle.z);
CalculateMotorForce(w.col,accel,steer); //6
}
leftTrackTextureOffset = Mathf.Repeat(leftTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f);
leftTrack.renderer.material.SetTextureOffset("_MainTex",new Vector2(0,-leftTrackTextureOffset));
trackRpm = CalculateSmoothRpm(rightTrackWheelData);
foreach (WheelData w in rightTrackWheelData){
w.wheelTransform.localPosition = CalculateWheelPosition(w.wheelTransform,w.col,w.wheelStartPos);
w.boneTransform.localPosition = CalculateWheelPosition(w.boneTransform,w.col,w.boneStartPos);
w.rotation = Mathf.Repeat(w.rotation + delta * trackRpm * 360.0f / 60.0f, 360.0f);
w.wheelTransform.localRotation = Quaternion.Euler(w.rotation, w.startWheelAngle.y, w.startWheelAngle.z);
CalculateMotorForce(w.col,accel,-steer); //6
}
rightTrackTextureOffset = Mathf.Repeat(rightTrackTextureOffset + delta*trackRpm*trackTextureSpeed/60.0f,1.0f);
rightTrack.renderer.material.SetTextureOffset("_MainTex",new Vector2(0,-rightTrackTextureOffset));
for(int i=0;i<leftTrackUpperWheels.Length;i++){
leftTrackUpperWheels[i].localRotation = Quaternion.Euler(leftTrackWheelData[0].rotation, leftTrackWheelData[0].startWheelAngle.y, leftTrackWheelData[0].startWheelAngle.z);
}
for(int i=0;i<rightTrackUpperWheels.Length;i++){
rightTrackUpperWheels[i].localRotation = Quaternion.Euler(rightTrackWheelData[0].rotation, rightTrackWheelData[0].startWheelAngle.y, rightTrackWheelData[0].startWheelAngle.z);
}
}
public void CalculateMotorForce(WheelCollider col, float accel, float steer){ //6
if(accel == 0 && steer == 0){ //7
col.brakeTorque = maxBrakeTorque; //7
}else if(accel == 0.0f){ //8
col.brakeTorque = rotateOnStandBrakeTorque; //9
col.motorTorque = steer*rotateOnStandTorque; //10
}
}
О чудо наш танк сошел с ума и теперь может крутиться со скоростью волчка, да еще и ездить боком, все правильно, теперь бокового трения нету совсем. Теперь выйдите из Play mode, поставьте значение в 0.06 и снова нажмите Play. Ну наконец то, теперь наш танк поворачивается вокруг своей оси и вполне адекватно. Выходите из Play mode и установите значение Sideways Friction обратно в 1. Конечно все это хорошо менять значение прямо из префаба, но лучше это делать из скрипта, потомучто когда боковое трение не управляемо есть шанс что наш танк будет входить в самый настоящий дрифт. Заодно научим танк ехать вперед и поворачивать во время движения. Модифицируем функцию CalculateMotorForce() и объявим еще маленько глобальных переменных:
public float forwardTorque = 500.0f; //1
public float rotateOnMoveBrakeTorque = 400.0f; //2
public float minBrakeTorque = 0.0f; //3
public float minOnStayStiffness = 0.06f; //4
public float minOnMoveStiffness = 0.05f; //5
public float rotateOnMoveMultiply = 2.0f; //6
public void CalculateMotorForce(WheelCollider col, float accel, float steer){
WheelFrictionCurve fc = col.sidewaysFriction; //7
if(accel == 0 && steer == 0){
col.brakeTorque = maxBrakeTorque;
}else if(accel == 0.0f){
col.brakeTorque = rotateOnStandBrakeTorque;
col.motorTorque = steer*rotateOnStandTorque;
fc.stiffness = 1.0f + minOnStayStiffness - Mathf.Abs(steer);
}else{ //8
col.brakeTorque = minBrakeTorque; //9
col.motorTorque = accel*forwardTorque; //10
if(steer < 0){ //11
col.brakeTorque = rotateOnMoveBrakeTorque; //12
col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//13
fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs(steer); //14
}
if(steer > 0){ //15
col.motorTorque = steer*forwardTorque*rotateOnMoveMultiply;//16
fc.stiffness = 1.0f + minOnMoveStiffness - Mathf.Abs(steer); //17
}
}
if(fc.stiffness > 1.0f)fc.stiffness = 1.0f; //18
col.sidewaysFriction = fc; //19
if(col.rpm > 0 && accel < 0){ //20
col.brakeTorque = maxBrakeTorque; //21
}else if(col.rpm < 0 && accel > 0){ //22
col.brakeTorque = maxBrakeTorque; //23
}
}