Unity3D, "выбитый" тип легкого объекта?

В сцене единства представьте

  • большой скользящий объект (возможно, "транспортный контейнер" или "диван", скользящий по какой-то причине)

  • в пути есть несколько светлых деревянных палочек высотой 2 метра, слегка застрявших в земле.

в реальной жизни палочки стояли бы там (во-первых, это действительно досадно трудно достичь в PhysX), и когда крупный объект поразил их,

  • большой объект будет совершенно не затронут

  • палки будут быстро сбиты с ног, вероятно, отскакивают от земли один или два раза, а затем приземляются где-нибудь

Я нашел это довольно трудно сделать в Unity.

Обычно вы говорите: "дайте большому предмету массу в несколько тысяч, а палкам - всего 1 или 2 кг".

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

И если вы устанавливаете угловое сопротивление большого объекта высоко, это не то, что вам нужно, это другое поведение.

Вначале я сделал кинематические палочки (чтобы они могли встать, не упав), а затем, когда большой объект ударил его...

protected void OnCollisionEnter(Collision collisionInfo) {

    rb.isKinematic = false;
}

Возможно, единственный способ сделать это

  • на самом деле, палки совершенно не подвержены физическому воздействию большого объекта

  • когда они касаются (срабатывают), на самом деле, просто независимо, палка случайно "слетает". (Имейте палочки, только сталкиваются с землей, пейзажем.)

Как это сделать в среде Unity/PhysX?

2 ответа

Решение

(Преобразование моего комментария в ответ)

Маленькие объекты будут влиять на большие объекты в реальной жизни, но незначительно (так что, может быть, слишком много палочек?). Или, может быть, проблема в том, как палки воткнуты в землю? Я создал тестовую сцену с кубом (1000 кг) и несколькими цилиндрами (1 кг). Все объекты просто свободно стоят на земле. Вот как это выглядит, когда куб попадает в цилиндры:

У меня был большой успех, когда "гремели" объекты карандаша вручную. Как это может кому-то помочь, вот как.

Как обычно у вас будет отдельный триггер под объектом на соответствующем слое:

public class BoomableTrigger : MonoBehaviour {

    public Boomable tell;

    protected void OnTriggerEnter(Collider other) {

        tell.Triggered(other.GetComponent<Rigidbody>().velocity);
    }
}

Тогда, чтобы действительно "бросить" это, черт возьми, вперед с юмористическим способом, когда Ваш автомобиль поражает это

public class Boomable : MonoBehaviour {

    Rigidbody rb;
    // obvious setup not shown ..

    public void Triggered(Vector3 vehicleVelocity) {

        // (very likely tell your networking this happened ...)
        DoBoom(vehicleVelocity);
    }

    public void DoBoom(Vector3 vehicleVelocity) {

        // assume we are being hit by a large vehicle

        rb.isKinematic = false;

        // make it spring forwards humorously

        rb.velocity = vehicleVelocity * Random.Range(1f,3f);

        // and make it "snap-fall, forwards" ...

        Vector3 worldLeftwards =
           Vector3.Cross(vehicleVelocity, Vector3.up).normalized;
        rb.angularVelocity =
           worldLeftwards * -1f * Random.Range(5f,50f);
    }

Это дает ему реальное мгновенное падение с Бастера Китона, он "отлетает" от автомобиля, как только автомобиль его ударит.

Экспериментирование показало хороший комический эффект, а также бросая его вперед (первое предложение), вам действительно нужно заставить его "падать вперед", что требует некоторого векторизации.

Не совсем понятно, почему в PhysX это не сработает естественным образом, как в ответе @ obywan, возможно, с кинематическим переворотом. Но если вы должны сделать это таким образом, это будет хорошо работать.

Другие вопросы по тегам