Синтаксис:
Используется csharp
private void Drop(Transform _Target, Player Unit)
{
float g = Physics.gravity.y;
Vector3 fromTo = _Target.position - Unit.Grenade.transform.position;
Vector3 fromToXZ = new Vector3(fromTo.x, 0f, fromTo.z);
Unit.transform.rotation = Quaternion.LookRotation(fromToXZ, Vector3.up);
float x = fromToXZ.magnitude;
float y = fromTo.y;
float AngleInRadians = 75 * Mathf.PI / 180;
float v2 = (g * x * x) / (2 * (y - Mathf.Tan(AngleInRadians) * x) * Mathf.Pow(Mathf.Cos(AngleInRadians), 2));
float v = Mathf.Sqrt(Mathf.Abs(v2));
Unit.Grenade.GetComponent<Rigidbody>().isKinematic = false;
//Unit.Grenade.GetComponent<CapsuleCollider>().isTrigger = false;
Unit.Grenade.transform.SetParent(null);
Unit.Grenade.GetComponent<Rigidbody>().velocity = Unit.transform.forward * v ;
}
{
float g = Physics.gravity.y;
Vector3 fromTo = _Target.position - Unit.Grenade.transform.position;
Vector3 fromToXZ = new Vector3(fromTo.x, 0f, fromTo.z);
Unit.transform.rotation = Quaternion.LookRotation(fromToXZ, Vector3.up);
float x = fromToXZ.magnitude;
float y = fromTo.y;
float AngleInRadians = 75 * Mathf.PI / 180;
float v2 = (g * x * x) / (2 * (y - Mathf.Tan(AngleInRadians) * x) * Mathf.Pow(Mathf.Cos(AngleInRadians), 2));
float v = Mathf.Sqrt(Mathf.Abs(v2));
Unit.Grenade.GetComponent<Rigidbody>().isKinematic = false;
//Unit.Grenade.GetComponent<CapsuleCollider>().isTrigger = false;
Unit.Grenade.transform.SetParent(null);
Unit.Grenade.GetComponent<Rigidbody>().velocity = Unit.transform.forward * v ;
}
И граната падает почти под ноги. нашел другой код(опять же не много адаптировав под себя)
Синтаксис:
Используется csharp
private void Drop(Transform _Target, Player Unit)
{
var p = Unit.Grenade.transform.parent;
Vector3 dir = target.position - Unit.transform.position; // get target direction
float h = dir.y; // get height difference
dir.y = 0; // retain only the horizontal direction
float dist = dir.magnitude; // get horizontal distance
float a = 45 * Mathf.Deg2Rad; // convert angle to radians
dir.y = dist * Mathf.Tan(a); // set dir to the elevation angle
dist += h / Mathf.Tan(a); // correct for small height differences
//calculate the velocity magnitude
float vel = Mathf.Sqrt(dist * Physics.gravity.magnitude / Mathf.Sin(2 * a));
Unit.Grenade.GetComponent<Rigidbody>().isKinematic = false;
Unit.Grenade.transform.SetParent(null);
Unit.Grenade.GetComponent<Rigidbody>().velocity = vel * dir.normalized;
}
{
var p = Unit.Grenade.transform.parent;
Vector3 dir = target.position - Unit.transform.position; // get target direction
float h = dir.y; // get height difference
dir.y = 0; // retain only the horizontal direction
float dist = dir.magnitude; // get horizontal distance
float a = 45 * Mathf.Deg2Rad; // convert angle to radians
dir.y = dist * Mathf.Tan(a); // set dir to the elevation angle
dist += h / Mathf.Tan(a); // correct for small height differences
//calculate the velocity magnitude
float vel = Mathf.Sqrt(dist * Physics.gravity.magnitude / Mathf.Sin(2 * a));
Unit.Grenade.GetComponent<Rigidbody>().isKinematic = false;
Unit.Grenade.transform.SetParent(null);
Unit.Grenade.GetComponent<Rigidbody>().velocity = vel * dir.normalized;
}
Граната летит как надо, но почему то гораздо дальше цели. Сама граната прикреплина к руке, и в момент броска отцепляется от родителя.