I’m working a a tank game (I’m new to Unity but know coding) in Unity and I’m trying to make realistic movement (where each tread moves separately).
I don’t want to use “wheel colliders” because it’s really overkill, and I can’t get it to work right anyway.
What I need is: the math for a function (with args for the 2 tread speeds), that will move the tank (using transform.Rotate & transform.Translate).
Like thus:
void Update () {
//get user input for tread speeds
Move (leftSpeed,rightSpeed);
}
void Move(float leftSpeed, float rightSpeed) {
//does calculations and moves tank
}
I’ve spent quite a while, on many a night trying to figure this out; I’m hoping I can solve this!
BTW: This game is mechanically 2D, so the tank has a fixed Y pos (and no hilly terrain).
Wow, I may have gotten it to work!
Here’s the function:
void Move(float leftSpeed, float rightSpeed){
int dir = 0;//direction
float s = 0;//slow tread (closer to 0)
float f = 0;//fast tread (farther from 0)
if (leftSpeed == rightSpeed) {//going straight
this.transform.Translate (new Vector3 (0, 0, leftSpeed * Time.deltaTime));
} else {
//---set fast/slow
if (Mathf.Abs(leftSpeed) < Mathf.Abs(rightSpeed)) {
dir = -1;
s = leftSpeed;
f = rightSpeed;
} else {
dir = 1;
f = leftSpeed;
s = rightSpeed;
}
f *= Time.deltaTime; s *= Time.deltaTime;
//---calculacte radius of inner drive circle
float r;//radius of inner circle
if (s == 0) {
r = 0;
} else {
r = treadDistance / ((f/s) - 1);
}
//---calc theta (degrees to rotate)
float t = (f / (r + treadDistance));//add treadDistance (and use f) to avoind divistion by 0
//--calculate travel distance
float distance = ((r + treadDistance / 2) * Mathf.Sin (t / 2) * 2);//distance to move at angle
//---do the moving
this.transform.Rotate (new Vector3 (0,(Mathf.Rad2Deg *t/2)*dir,0));//rotate halfway
this.transform.Translate (new Vector3 (0,0,distance));//move
this.transform.Rotate (new Vector3 (0,(Mathf.Rad2Deg *t/2)*dir,0));//rotate the rest
}
}