Один из способов сделать это - дублировать наземный объект и заменить падающий объект на измененную версию этого дубликата.Как вы можете сделать это, выполнив следующие действия при входе в столкновение между падающим объектом и данным наземным объектом:
- Убедитесь, что этот падающий объект еще не столкнулся с этим наземным объектом, например:
fallingObject.lastCopiedGroundObject
GameObject
. - Найти
y
из groundObject
Collider.bounds.size
- Добавить
y
к groundObject.transform.position
к новому Vector3 newPos
- Используйте
GameObject newFalling = Object.Instantiate(groundObject, newPos, groundObject.rotation, fallingObject.parent)
. - Скопируйте
rotationalVelocity
и velocity
с жесткого тела падающего объекта на жесткий корпус newFalling
, если необходимо. - Добавьте, удалите,при необходимости измените компоненты на
newFalling
(например, заменив текстуры), чтобы он продолжал вести себя правильно и отображался при замене падающего объекта. - Уничтожьте старый падающий объект с помощью
fallingObject.Destroy()
- Установите
lastCopiedGroundObject
из newFalling
, чтобы newFalling
больше не выполнял это взаимодействие с тем же groundObject
, пока не будет сделана другая копия.
Это приведет к падениюобъект над земным объектом, и позволит ему упасть, используя физический движок, чтобы определить, где яt должен лежать сверху.
Одно из соображений состоит в том, чтобы вместо этого использовать List<GameObject> alreadyCopiedGroundObjects
и добавить недавно столкнувшийся наземный объект в список в старом падающем объекте, чтобы, если падающий объект касался нескольких земель, онменяйте его форму только один раз, чтобы при определенных условиях он не колебался между формами.