Как я могу сделать движение игрока относительно камеры? - PullRequest
0 голосов
/ 22 сентября 2019

Я работаю над игрой на основе физики для Unity Box, для этого я толкаю коробку.Я хочу, чтобы игрок мог перемещать камеру по оси X вокруг рамки, но это означает, что если игрок перемещает камеру к задней части рамки, движение меняется на противоположное.

Я попытался посмотреть надругие сообщения / учебники, но никто не делает то, что я пытаюсь сделать.

Вот мой код движения игрока,

using System.Collections.Generic;
using UnityEngine;
public class Movement : MonoBehaviour
{

    Rigidbody rb;

    public float forwardBackForce = 1000f;
    public float leftRightForce = 1000f;

    // Gets component Rigidbody
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Used for movement
    void FixedUpdate()
    {

        if (Input.GetKey(KeyCode.W))
        {
            rb.AddForce(0, 0, forwardBackForce * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.S))
        {
            rb.AddForce(0, 0, -forwardBackForce * Time.deltaTime);
        }

        if (Input.GetKey(KeyCode.A))
        {
            rb.AddForce(-leftRightForce * Time.deltaTime, 0, 0);
        }

        if (Input.GetKey(KeyCode.D))
        {
            rb.AddForce(leftRightForce * Time.deltaTime, 0, 0);
        }
    }
}

А вот мой код движения камеры,

using System.Collections.Generic;
using UnityEngine;

public class playerCamera : MonoBehaviour
{

    public Transform PlayerTransform;

    private Vector3 _cameraOffset;

    [Range(0.01f, 1.0f)]
    public float SmoothFactor = 0.05f;

    public bool LookAtPlayer = false;

    public bool RotateAroundPlayer = true;

    public float RotationSpeed = 5.0f;

    // Start is called before the first frame update
    void Start()
    {
        _cameraOffset = transform.position - PlayerTransform.position;
    }

    // LateUpdate is called after Update
    void LateUpdate()
    {

        if(RotateAroundPlayer)
        {
            Quaternion camTurnX = Quaternion.AngleAxis(Input.GetAxis("Mouse X") * RotationSpeed, Vector3.up);
            _cameraOffset = camTurnX * _cameraOffset;

        }


        Vector3 newPos = PlayerTransform.position + _cameraOffset;

        transform.position = Vector3.Slerp(transform.position, newPos, SmoothFactor);

        if (LookAtPlayer || RotateAroundPlayer)
            transform.LookAt(PlayerTransform);
    }




}

Все, что мне нужно, это способ заставить игрока двигаться относительно камеры.

И последнее замечание: я работаю над системой столкновений, поэтому коробка не может продолжать давить на стену.

1 Ответ

0 голосов
/ 22 сентября 2019

В настоящее время вы используете только глобальное направление Z или X.

Полагаю, вам скорее всего нужно направление в направлении взгляда камеры, поэтому используйте, например,

[SerializeField] private Camera mainCamera;

private void Awake()
{
    if(!mainCamera) mainCamera = Camera.main;
}

...

rb.AddForce(mainCamera.transform.forward * forwardBackForce * Time.deltaTime);

...

rb.AddForce(mainCamera.transform.right * -leftRightForce * Time.deltaTime);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...