Движение объекта. Ограничение по скорости и остановка.
|
|
alexsilent | Дата: Четверг, 01 Августа 2013, 23:10 | Сообщение # 1 |
почти ветеран
Сейчас нет на сайте
| Уже пару дней мучаюсь с rigidbody, и с AddForce... Хочу сделать, чтобы герой подлетал плавно к цели и останавливался, а если выбирать другую цель, то перемещался туда по законам инерции слегка с заносом, но без изменение угла/поворота (объект который не поворачивается носом к цели)...
Разобрался с тем, чтобы объект двигался так, но теперь появилась новая проблема, объект движется без ограничения по скорости, и занос слишком крутой и не знаю, как сделать чтобы останавливался объект около цели. Как сделать, чтобы ограничить движение по скорости? Код #pragma strict
var target : Vector3; var speed : float = 2.0;
function Update() { if(Input.GetMouseButton(0)) { var distance : float = transform.position.z - Camera.main.transform.position.z; target = Camera.main.ScreenToWorldPoint (Vector3 (Input.mousePosition.x,Input.mousePosition.y,distance)); // set target } rigidbody.AddForce((target-transform.position).normalized*speed); //apply force print("rigidbody.velocity: "+rigidbody.velocity); }
Сообщение отредактировал alexsilent - Пятница, 02 Августа 2013, 05:22 |
|
| |
lentinant | Дата: Пятница, 02 Августа 2013, 00:48 | Сообщение # 2 |
ленивый программист
Сейчас нет на сайте
| Создаешь переменную максимальной скорости, создаешь временный двухмерный вектор, и присваиваешь его x и y компонентам x и z компоненты rigidbody.velocity, берешь его magnitude, сравниваешь ее с твоей максимальной скоростью, и если максимальная скорость превышена, нормализируешь временный вектор, умножаешь его на максимальную скорость, и обратно присваиваешь компонентам rigidbody.velocity компоненты временного вектора.
Когда-то тут будут ссылки на крутые проекты. Или нет.
|
|
| |
alexsilent | Дата: Пятница, 02 Августа 2013, 05:17 | Сообщение # 3 |
почти ветеран
Сейчас нет на сайте
| lentinant, Спасибо! Более-менее нормально получилось! Только вот с акселерацией траблы непонятные) хотелось чтобы ускорение накапливалось постепенно, но из-за того-что я пока не понимаю как делать я умножаю просто в общую кучу и это получается тоже дополнительной скоростью, а не постепенным ускорением.
Код #pragma strict
var target : Vector3; var speed : float = 10.0; var acceleration : float = 12.0;
function Update() { if(Input.GetMouseButton(0)) { var distance : float = transform.position.z - Camera.main.transform.position.z; target = Camera.main.ScreenToWorldPoint (Vector3 (Input.mousePosition.x,Input.mousePosition.y,distance)); // set target } }
function FixedUpdate() { rigidbody.velocity *= .9; var correct_speed : float = Mathf.Clamp(Vector3.Distance(target,transform.position)*.1,0,.5); rigidbody.AddForce((target-transform.position).normalized * speed * acceleration * correct_speed); //apply force if (rigidbody.velocity.magnitude > speed) { rigidbody.velocity = rigidbody.velocity.normalized * speed; } print("rigidbody.velocity 0: "+rigidbody.velocity.magnitude); }
Сообщение отредактировал alexsilent - Пятница, 02 Августа 2013, 05:23 |
|
| |
Левша | Дата: Пятница, 02 Августа 2013, 06:37 | Сообщение # 4 |
почти ветеран
Сейчас нет на сайте
| Цитата (alexsilent) это получается тоже дополнительной скоростью, а не постепенным ускорением. Mathf.Lerp
X.cor.R (Prologue)
|
|
| |
lentinant | Дата: Пятница, 02 Августа 2013, 17:19 | Сообщение # 5 |
ленивый программист
Сейчас нет на сайте
| Или Mathf.SmoothDamp
Когда-то тут будут ссылки на крутые проекты. Или нет.
|
|
| |
|