Tôi đang cố gắng phóng một vật thể vào một mục tiêu, với vị trí của nó, vị trí mục tiêu của nó, tốc độ phóng và trọng lực. Tôi đang theo công thức này từ Wikipedia :
Tôi đã đơn giản hóa mã theo khả năng tốt nhất của mình, nhưng tôi vẫn không thể liên tục đạt được mục tiêu. Tôi chỉ đang xem xét quỹ đạo cao hơn, trong số hai có sẵn từ lựa chọn + - trong công thức.
Có ai biết tôi đang làm gì sai không?
using UnityEngine;
public class Launcher : MonoBehaviour
{
public float speed = 10.0f;
void Start()
{
Launch(GameObject.Find("Target").transform);
}
public void Launch(Transform target)
{
float angle = GetAngle(transform.position, target.position, speed, -Physics2D.gravity.y);
var forceToAdd = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle)) * speed;
GetComponent<Rigidbody2D>().AddForce(forceToAdd, ForceMode2D.Impulse);
}
private float GetAngle(Vector2 origin, Vector2 destination, float speed, float gravity)
{
float angle = 0.0f;
//Labeling variables to match formula
float x = Mathf.Abs(destination.x - origin.x);
float y = Mathf.Abs(destination.y - origin.y);
float v = speed;
float g = gravity;
//Formula seen above
float valueToBeSquareRooted = Mathf.Pow(v, 4) - g * (g * Mathf.Pow(x, 2) + 2 * y * Mathf.Pow(v, 2));
if (valueToBeSquareRooted >= 0)
{
angle = Mathf.Atan((Mathf.Pow(v, 2) + Mathf.Sqrt(valueToBeSquareRooted)) / g * x);
}
else
{
//Destination is out of range
}
return angle;
}
}