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, возможно, с кинематическим переворотом. Но если вы должны сделать это таким образом, это будет хорошо работать.