Бросок гранаты по пораболе

Программирование на Юнити.

Бросок гранаты по пораболе

Сообщение MrDmitry 07 апр 2023, 13:27

Знаю что вопрос не раз уже решался, но все же. Нашел код броска гранаты на просторах интернета и адаптировал под себя.



Синтаксис:
Используется 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 ;
    }


И граната падает почти под ноги. нашел другой код(опять же не много адаптировав под себя)

Синтаксис:
Используется 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;
}


Граната летит как надо, но почему то гораздо дальше цели. Сама граната прикреплина к руке, и в момент броска отцепляется от родителя.
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Бросок гранаты по пораболе

Сообщение 1max1 07 апр 2023, 14:07

Сразу к коду https://youtu.be/lXSzdGBIPkg?t=1500

Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Бросок гранаты по пораболе

Сообщение MrDmitry 07 апр 2023, 16:24

С этого видео я код и взял :D Но что то не то...
MrDmitry
UNITрон
 
Сообщения: 223
Зарегистрирован: 05 авг 2017, 17:21

Re: Бросок гранаты по пораболе

Сообщение 1max1 07 апр 2023, 16:56

Там у него есть ссылка на проект, можешь скачать сверить.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7