Car Collision Return Force - 3D Автомобильная Игра - PullRequest
0 голосов
/ 11 февраля 2019

Согласно моим игровым требованиям, я давал ручное усилие, когда две машины сталкивались друг с другом и двигались назад.Поэтому я хочу правильный код, который может оправдать это.Вот пример ответа о столкновении, который я хочу получить:

enter image description here

Насколько я понимаю, я написал этот код:

 Vector3 reboundDirection = Vector3.Normalize(transform.position - other.transform.position);
    reboundDirection.y = 0f;
    int i = 0;
    while (i < 3)
    {
        myRigidbody.AddForce(reboundDirection * 100f, ForceMode.Force);
        appliedSpeed = speed * 0.5f;
        yield return new WaitForFixedUpdate();
        i++;
    }

Я двигаюсь, мои машины используют этот код:

    //Move the player forward       
    appliedSpeed += Time.deltaTime * 7f;
    appliedSpeed = Mathf.Min(appliedSpeed, speed);
    myRigidbody.velocity = transform.forward * appliedSpeed;

Тем не менее, по моим наблюдениям, я не получил отклик о столкновении в правильном направлении.Как правильно получить ответ о столкновении с эталонным изображением?

1 Ответ

0 голосов
/ 11 февраля 2019

Пока вы не объясните, почему вы используете ручные силы или как вы справляетесь с силами, генерируемыми Unity Engine, я бы хотел подчеркнуть одну проблему в вашем подходе.Вы рассчитываете направление на основе позиций, но позиции являются центром ваших автомобилей.Таким образом, вы не получаете правильное направление, как вы можете видеть на изображении ниже:

enter image description here

Таким образом, вы рассчитываете направление между двумя опорными или центральными точкамиВаша сила немного наклонена на левом изображении.Вместо этого вы можете использовать ContactPoint и затем рассчитать направление.

Как более подробную информацию, чтобы ОП мог понять, что я сказал!На изображении выше вы можете увидеть область с синим прямоугольником.Вы получите все контактные точки для соответствующего региона, используя Collision.contacts

enter image description here, затем вычислите центральную точку или центроид, как это

Vector3 centroid = new Vector3(0, 0, 0);
foreach (ContactPoint contact in col.contacts)
    {           
        centroid += contact.point;
    }
    centroid = centroid / col.contacts.Length;

Этоцентр прямоугольника, чтобы найти направление, которое вам нужно, чтобы найти его проекцию на вашем автомобиле следующим образом:

    Vector3 projection = gameObject.transform.position;
    projection.x = centroid.x;
    gameObject.GetComponent<Rigidbody>().AddForce((projection - centroid  )*100, ForceMode.Impulse);

Так как я не знаю ваши настройки, я только что получил значения y и z с позиции автомобиля, но xзначение от centroid, поэтому вы получаете прямую синюю линию, а не стрелку, наклоненную влево, как на первом изображении, даже в случае двух второго изображения.Я надеюсь, что я проясняюсь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...