Unity: как переместить объект в направлении, обращенном к камере

#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 есть пример именно этого.