Объект движется вперед при нажатии S и наоборот при нажатии W
Есть объект (овца), недавно начал изучать углы Эйлера и все дела (буду благодарен если дадите ресурсы для изучения, такие как книги по юнити), так вот, овца идет вперед по нажатию клавиши S и назад при нажатии клавиши W. Я так понимаю дело именно в осях, а точнее в направлении векторов. Суть такова, что овца должна двигаться вперед/назад и влево/вправо.
Вот код управления овцой
public float speed = 6.0f;
public float gravity = -9.8f;
public CharacterController _charController;
private void Start()
{
_charController = GetComponent<CharacterController>();
Debug.Log(_charController);
}
void Update()
{
float deltaZ = Input.GetAxis("Horizontal") * speed;
float deltaX = Input.GetAxis("Vertical") * speed;
transform.Translate(-deltaX * Time.deltaTime, 0, deltaZ * Time.deltaTime);
Vector3 movement = new Vector3(deltaX, 0, deltaZ);
movement = Vector3.ClampMagnitude(movement, speed);
movement.y = gravity;
movement *= Time.deltaTime;
movement = transform.TransformDirection(movement);
_charController.Move(movement);
};
в Vector3, где deltaX, я так думаю, надо сделать так, чтобы выражение было именно разностью, т.к у меня получается объект движется в обратную сторону.
объяснил, блин
Ответы (1 шт):
Текст поста не содержит прямого вопроса или описания проблемы, а предложения логически слабо связаны. Причём тут углы эйлера... их тут нет и вообще они отвечают за поворот в 3d пространстве и не связаны с вектором. И это не бином ньютона что бы читать о этом целые книги, банальные углы от 0 до 360 как на обычном круге на школьной доске, только по своему кругу для x, y и z.
Описан лишь желаемый результат после слов: "Суть такова". Вот код:
[DisallowMultipleComponent]
// если компонент обязателен то указываем это
[RequireComponent(typeof(CharacterController))]
public class SheepController : MonoBehaviour {
// для того, чтобы не делать публичным то, что не должно им быть
// но должно отображаться в инспекторе
[SerializeField] private float _speed = 6.0f;
[SerializeField] private float _gravity = 9.8f;
private Transform _transform;
private CharacterController _controller;
private void Awake () {
_transform = transform;
_controller = GetComponent<CharacterController>();
}
private void Update () {
// вертикаль v на вектор, куда направлен объект, а горизонталь h на вектор с право от него.
Vector3 Move = _transform.forward*Input.GetAxis("Vertical")+_transform.right*Input.GetAxis("Horizontal");
// поскольку одновременно зажатые v и h могут дать (1, 1)
// и превысить длину в 1 в этом случае его нужно нормализовать
if (Move.magnitude > 1)
Move.Normalize();
Move *= _speed;
// гравитацию добавляем после наложения на оси объекта, а не до!
// иначе упав на бок, овца полетит куда направлен живот, а не в низ
Move.y -= _gravity;
Move *= Time.deltaTime;
_controller.Move(Move);
}
}