Задача состоит в следующем: реализовать перемещение космического корабля из исходной точки в заданную на плоскости.
Космический корабль, в моём понимании, должен перемещаться в пространстве ориентируясь носом в сторону точки, в которую он хочет прибыть. Пользуясь своими скудными знаниями аналитической геометрии, я написал следующий код:
Код
public class CubeMovement : MonoBehaviour {
public float Bx = 10,Bz = 10, speed = 10;
public double delta = 0.2;
float x;
float z;
Vector3 PosB;
float dirlength;
float flength;
static float angle = 0;
RaycastHit hit;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
x = transform.position.x;
z = transform.position.z;
PosB = new Vector3 (Bx - x, 0, Bz - z);
dirlength = Mathf.Sqrt (1);
flength = Mathf.Sqrt (PosB.x * PosB.x + PosB.z * PosB.z);
if (x <= Bx-0.01F || z <= Bz-0.01F || x >= Bx+0.01F || z >= Bz+0.01F) {
if ((Mathf.Sin ((angle)) * PosB.x + Mathf.Cos ((angle)) * PosB.z) / flength < (1 - delta)) {
bool F = (Mathf.Abs ((Mathf.Sin (angle + speed * Time.deltaTime) * PosB.x - Mathf.Cos (angle + speed * Time.deltaTime) * PosB.z) / flength) - Mathf.Abs ((Mathf.Sin (angle) * PosB.x + Mathf.Cos (angle) * PosB.z) / flength) < 0);
bool C = Mathf.Abs (Mathf.Abs ((Mathf.Sin (angle + speed * Time.deltaTime) * PosB.x - Mathf.Cos (angle + speed * Time.deltaTime) * PosB.z) / flength) - Mathf.Abs ((Mathf.Sin (angle) * PosB.x + Mathf.Cos (angle) * PosB.z) / flength)) < 0.0001F;
if (F) {
print ("2");
transform.Rotate (Vector3.up, speed * Time.deltaTime*5);
angle += speed * Time.deltaTime;
}
else
if(!C)
{
print ("3");
transform.Rotate (Vector3.up, -speed * Time.deltaTime*5);
angle -= speed * Time.deltaTime;
}
}
else
transform.Translate (Vector3.forward * Time.deltaTime);
}
}
}
Корабль дёргается, пытаясь попасть в заданный угол, что довольно проблематично, судя по всему.
Покорно прошу наставить меня на пусть истинный.