доброго времени суток уважаемые! вот нелёгкая занесла меня на форум ибо уже всю голову сломал пытаясь понять в каком направлении идти. собственно сделал капсулу на нее повесил скрипт движения и дописал туда кусок кода что бы капсула поворачивалась в сторону движения но после ее поворота оси как то проворачиваются что ли и нажимая движение влево капсула поворачивается туда и едет вниз. я так понимаю что оси ввода поворачиваются вместе с капсулой но что то не могу понять уже часов 5 как это исправить п.с. камера статичная как в диабло
Код
using UnityEngine; using System.Collections;
public class PlayerController : MonoBehaviour { public Transform capsule; public float capsuleAngleRotation; float speed = 10; Rigidbody rb;
Euler Это углы эйлера, те самые которые мы привыкли использовать от 0 до 360. Передавая туда вектор вы максимум получате 1 градус по одной оси. Если вектор нормализован. Домножая один Кватернион на другой мы получаем вращение второго в локальных координатах первого.
В данной ситуации вам нужно двигать вашего героя так rb.MovePosition(rb.position+transform.forward)*speed*Time.deltaTime; То-есть просто прямо.
Ваш вектор dir надо передовать в функцию Quaternion.LookRotation(dir.normalized,Vector3.up). Если ваш герой двигается не в одной плоскости и наклоняется то тогда вам нужна нормаль пола (вектор куда смотрит в этот момент кусок пола на ктором вы стоите) и вместо Vector3.up подставлять эту нормаль. Ее можно найти рэйкастом.
priestevi, не совсем понятно относительно чего выбирается направление: камеры, персонажа или фиксированные направления. В большинстве согласен с Wite. Не совсем корректно используются углы Эйлера и/или перемещение.
Ниже приведу два варианта.
1. Камера фиксирована, персонаж перемещается в направлении нажатой клавиши (W, A, S, D - вверх, влево, вниз, вправо соответственно): Пример:
Код:
Код
Vector3 dir = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")) * moveSpeed; dir = Vector3.ClampMagnitude(dir, moveSpeed);
if (dir != Vector3.zero) { rb.MovePosition(transform.position + dir * Time.deltaTime); rb.MoveRotation(Quaternion.LookRotation(dir)); }
2. Камера фиксирована, перемещение персонажа при помощи вращения и движения прямо/назад (W, S - прямо и назад; A, D - поворот влево и вправо соответственно) Пример:
Код:
Код
// Вынести за функцию float rotSpeed = 3f;
// Внутри функции float rotation = Input.GetAxis("Horizontal") * rotSpeed; float move = Input.GetAxis("Vertical") * moveSpeed * Time.deltaTime;
всем спасибо за ответы! сейчас сяду переделывать и обязательно сообщу результат Rean ваш первый вариант это именно тот результат которого я хочу добиться итак в общем все работает по примеру товарища Rean`а спасибо за помощь, я бы в этих нюансах сам не разобрался скорее всего. Вот итоговый код если вдруг кому то пригодится
Код
using UnityEngine; using System.Collections;
public class PlayerController : MonoBehaviour { public Transform capsule; public float capsuleAngleRotation; float speed = 10; Rigidbody rb;
void FixedUpdate () { Vector3 dir = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical")) * speed; dir = Vector3.ClampMagnitude(dir, speed);
if (dir != Vector3.zero) { rb.MovePosition(transform.position + dir * Time.deltaTime); rb.MoveRotation(Quaternion.LookRotation(dir)); } }
}
Добавлено (10 февраля 2017, 11:49) --------------------------------------------- в моем сферическом мире капсула теперь во время движения перестала находиться перпендикулярно земле на экваторе, подскажите пожалуйста как сделать что бы капсула была перпендикулярно земле? в самом начале где у меня еще было кривое вращение там перпендикуляр соблюдался при движении по всей окружности вот пример мира
как стало работать
Сообщение отредактировал priestevi - Пятница, 10 Февраля 2017, 09:03