#c# #unity3d
#c# #unity-игровой движок
Вопрос:
Я использую Unity и пытаюсь переместить свой объект player в направлении, относительно которого направлена камера. В настоящее время камера может вращаться по орбите вокруг объекта игрока с помощью мыши, однако она перемещается только в направлениях относительно окружающего мира, а не камеры. По сути, я пытаюсь воспроизвести то, что делает game Absolver. В этом видео на YouTube примерно в 4: 30 есть хороший клип, показывающий движение камеры / проигрывателя: https://www.youtube.com/watch?v=_lBqCTeJwYwamp;t=1199s .
Я просмотрел видеоролики YouTube, ответы Unity и руководства по написанию сценариев, касающиеся джойстиков, кватернионов и значений Эйлера, но я просто не могу найти решение, которое соответствует моей конкретной проблеме. Любая помощь была бы просто замечательной. Заранее спасибо!
Код поворота камеры:
using UnityEngine;
public class FollowPlayer : MonoBehaviour
{
private const float Y_ANGLE_MIN = 0f;
private const float Y_ANGLE_MAX = 85f;
public Transform lookAt;
public Transform camTransform;
private Camera cam;
private float distance = 10f;
private float currentX = 0f;
private float currentY = 0f;
private float sensitivityX = 5f;
private float sensitivityY = 5f;
private void Start()
{
camTransform = transform;
cam = Camera.main;
}
private void Update()
{
currentX = Input.GetAxis("Mouse X") * sensitivityX;
currentY -= Input.GetAxis("Mouse Y") * sensitivityY;
currentY = Mathf.Clamp(currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
}
private void LateUpdate()
{
Vector3 dir = new Vector3(0, 0, -distance);
Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);
camTransform.position = lookAt.position rotation * dir;
camTransform.LookAt(lookAt.position);
}
}
Код перемещения игрока:
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public Rigidbody rb;
public Camera cam;
public float movementForce = 500f;
// Update is called once per frame
void FixedUpdate()
{
if (Input.GetKey("w"))
{
rb.AddForce(0, 0, movementForce * Time.deltaTime, ForceMode.VelocityChange);
}
if (Input.GetKey("a"))
{
rb.AddForce(-movementForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (Input.GetKey("s"))
{
rb.AddForce(0, 0, -movementForce * Time.deltaTime, ForceMode.VelocityChange);
}
if (Input.GetKey("d"))
{
rb.AddForce(movementForce * Time.deltaTime, 0, 0, ForceMode.VelocityChange);
}
if (rb.position.y < -1f)
{
FindObjectOfType<GameManager>().EndGame();
}
}
}
Ответ №1:
Вы хотите использовать transform.forward
свойство вашей камеры.
Что-то вроде этого:
rb.AddForce(cam.transform.forward * movementForce * Time.deltaTime, ForceMode.VelocityChange);
В вашем распоряжении также есть:
transform.left
transform.right
В документах AddForce есть пример именно этого.