Страница 1 из 1

Движение по направлению джостика с плавным поворотом

СообщениеДобавлено: 13 мар 2018, 19:44
f1rze
Вообщем есть машинка вид сверху,есть один джостик на экране,как сделать такое движение,чтобы в какую сторону джостик отклонил туда машинка и ехала,но поворачивалась плавно, а не мгновенно.Прилагаю код ,где поворачивается мгновенно - куда джостик направишь,как сделать плавно долго гуглил,не смог найти решение.



Синтаксис:
Используется csharp
using UnityStandardAssets.CrossPlatformInput;
public class Player : MonoBehaviour {
public float moveForce = 5;
void FixedUpdate () {

                Vector3 moveVec = new Vector3(CrossPlatformInputManager.GetAxis ("Horizontal"), CrossPlatformInputManager.GetAxis ("Vertical"),4096) ;
                if (moveVec.x!=0 && moveVec.y!=0)
                        transform.rotation = Quaternion.LookRotation (moveVec,Vector3.back);
                rb.AddForce (moveVec* moveForce);
       
        }
}

Re: Движение по направлению джостика с плавным поворотом

СообщениеДобавлено: 13 мар 2018, 20:41
Anonymyx
Либо углы лерпить либо вектор...

Запоминаете кватернион:
Quaternion targetRotation;
...
targetRotation = Quaternion.LookRotation (moveVec,Vector3.back);

И потом вне условия лерпите:
transform.rotation = Quaternion.Slerp(transorm.rotation, targetRotation, rotationForce * Time.deltaTime);

Если используете физику для движения, то вращения задавайте через MoveRotation().

Re: Движение по направлению джостика с плавным поворотом

СообщениеДобавлено: 13 мар 2018, 22:56
f1rze
Я потестил вот такой код,и там почему-то объект вбок или вверх движется медленнее чем по диагонали.Почему это происходит и как исправить?

Vector3 moveVec = new Vector3(CrossPlatformInputManager.GetAxis ("Horizontal"), CrossPlatformInputManager.GetAxis ("Vertical"),4096) ;
if (moveVec.x != 0 && moveVec.y != 0)
targetRotation = Quaternion.LookRotation (moveVec, Vector3.back);
transform.rotation= Quaternion.Slerp (transform.rotation, targetRotation, rotationForce * Time.deltaTime);
rb.AddForce (moveVec* moveForce);

Re: Движение по направлению джостика с плавным поворотом

СообщениеДобавлено: 13 мар 2018, 23:26
Anonymyx
Происходит потому что длина векторе увеличивается, т.е. становится * 1.4.
Т.е. представьте треугольник S-W-D (образно), стороны = 1, и длина вектора получается равной длине гипотенузы (W-D), т.е. Sqrt(1^2 + 1^2). = 1.4f
Попробуйте нормализовать вектор:
rb.AddForce (moveVec.normalized * moveForce);

Re: Движение по направлению джостика с плавным поворотом

СообщениеДобавлено: 14 мар 2018, 18:13
f1rze
Вообщем я нормализовал вектор,но ничего не изменилось(

Синтаксис:
Используется csharp
void FixedUpdate () {
               Vector3 moveVec = new Vector3(CrossPlatformInputManager.GetAxis ("Horizontal"), CrossPlatformInputManager.GetAxis ("Vertical"),4096) ;
                if (moveVec.x != 0 && moveVec.y != 0)
                        targetRotation = Quaternion.LookRotation (moveVec, Vector3.back);
                transform.rotation= Quaternion.Slerp (transform.rotation, targetRotation, rotationForce * Time.deltaTime);
                rb.AddForce (moveVec.normalized* moveForce);
}