среда, 4 апреля 2012 г.

Физические свойства игрового объекта

Метод rigidbody объекта GameObject хранит в себе его физические свойства. Прежде, чем использовать метод rigidbody, его необходимо добавить к игровому объекту.

Получаем/задаем вектор скорости объекта:
var velocity = GameObject.rigidbody.velocity;
GameObject.rigidbody.velocity = Vector3(0, 1, 0);




Сила противодействия объекта. Может использоваться для замедления скорости, в среде с отсутствующей силой трения. Наиболее часто используется для замедления падающих объектов, например при создании парашюта. Принимает в качестве параметра целое число:
GameObject.rigidbody.drag = 100;


Задание массы объекту. Рекомендуется использовать массу в пределах от 0.1 до 10. Использование слишком больших значений может привести к непредсказуемым результатам при расчете физики:
GameObject.rigidbody.mass = 5;


Влияние на объект гравитации. Принимает в качестве параметра булево значение. Позволяет отключить влияние гравитации на отдельные объекты:
GameObject.rigidbody.useGravity = false;


Влияние физики на игровой объект. Позволяет отключить частично, либо полностью влияние физических законов на объект:
GameObject.rigidbody.isKinematic = true;


Запрет на вращение объекта. Наиболее часто используется, когда необходимо сохранить определенный угол поворота даже после столкновения с другими объектами:
GameObject.rigidbody.freezeRotation = true;


Указание координат точки центра массы объекта. Применяет координаты в виде уже знакомого нам объекта Vector3.
GameObject.rigidbody.centerOfMass = Vector3(1, 0, 0);


Использовать ли для объекта обнаружение столкновений с другими объектами. Можно выключить, тогда ваш объект будет игнорировать любые столкновения:
GameObject.rigidbody.detectCollisions = false;


Режим определения столкновений между объектами. Можно указать несколько разных режимов:
CollisionDetectionMode.ContinuousDynamic для быстро движущихся объектов;
CollisionDetectionMode.Continuous для столкновений с быстро движущимися объектами;
CollisionDetectionMode.Discrete (по умолчанию) для обычных столкновений;
В случае отсутствия проблем с определением столкновений рекомендуется использовать свойство по умолчанию.

Задать плотность объекта:
GameObject.rigidbody.SetDensity(1.5);


Применить импульс к объекту с указанным вектором. В результате применения импульса объект придет в движение пропорционально силе импульса.
GameObject.rigidbody.AddForce(5, 0, 0);


Применить импульс к объекту с вектором в его (объекта) системы координат:
GameObject.rigidbody.AddRelativeForce(0, 0, 5);


Добавить объекту крутящий момент. Применение данного метода заставит объект вращаться вокруг своего центра масс GameObject.rigidbody.centerOfMass.
GameObject.rigidbody.AddTorque(0, 1, 0);


Тоже самое, что и предыдущий пример, но относительно координат объекта:
GameObject.rigidbody.AddRelativeTorque (1, 0, 0);


Применение импульса к объекту из внешней указанной точки. Заставляет объект двигаться и вращаться одновременно. Может использоваться, например, для симуляции попадания в объект пули. Первый параметр указывает вектор направления силы, второй параметр — исходную точку направления силы.
GameObject.rigidbody.AddForceAtPosition(Vector3(0, 5, 7), Bomb.transform.position);


Для полноценной симуляции объемных взрывов в Unity3D есть отдельный метод. Первый параметр метода позволяет указать мощность импульса, второй параметр — точку, из которой исходит импульс, третий параметр — радиус распространения импульса, четвертый параметр — модификатор сжатия сферы распространения силы, пятый, необязательный, параметр указывает тип используемого импульса:
GameObject.rigidbody.AddExplosionForce(power, explosionPos, radius, 2.0);


Заставить объект «уснуть», и запретить дальнейший расчет физических показателей для него:
GameObject.rigidbody.Sleep();


Проверить «заснул» ли объект:
GameObject.rigidbody.IsSleeping();


«Разбудить» объект для возможности дальнейшего применения влияния физики на него:
GameObject.rigidbody.WakeUp();

2 комментария: