изменить направление движения при вращении - PullRequest
0 голосов
/ 30 сентября 2018

Я создал движение FPS, но движение игрока неверно.При вращении влево или вправо игрок все еще движется вперед.

PlayerMovement.cs

public class PlayerMovement : MonoBehaviour
{
    private Vector3 movement;
    private Rigidbody rigid;
    private bool jumpPressed;

    private const int MOVEMENT_SPEED = 8;
    private const int JUMP_POWER = 20;

    private void Awake()
    {
        rigid = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        SetInputs();
    }

    private void FixedUpdate()
    {
        Jump();
        Move();
    }

    private void SetInputs()
    {
        movement.x = Input.GetAxis("Horizontal") * MOVEMENT_SPEED;
        movement.y = rigid.velocity.y;
        movement.z = Input.GetAxis("Vertical") * MOVEMENT_SPEED;
        jumpPressed = Input.GetKeyDown(KeyCode.Space);
    }

    private void Jump()
    {
        if (jumpPressed && GroundCheck())
        {
            movement.y = JUMP_POWER;
            jumpPressed = false;
        }
    }

    private void Move()
    {
        rigid.velocity = movement;
    }

    private bool GroundCheck()
    {
        return true;
    }
}

CameraMovement.cs

public class CameraMovement : MonoBehaviour
{
    private Transform player;
    private Vector2 rotation;

    private Quaternion originalRotation;

    private const int HORIZONTAL_ROTATION_SPEED = 5;
    private const int VERTICAL_ROTATION_SPEED = 5;
    private const int VERTICAL_ROTATION_MIN = -80;
    private const int VERTICAL_ROTATION_MAX = 80;

    private void Awake()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
    }

    private void Start()
    {
        originalRotation = transform.localRotation;
    }

    private void Update()
    {
        SetInputs();
        RotateCamera();
        RotatePlayer();
    }

    private void SetInputs()
    {
        rotation.x = Input.GetAxisRaw("Mouse X") * HORIZONTAL_ROTATION_SPEED;

        rotation.y += Input.GetAxisRaw("Mouse Y") * VERTICAL_ROTATION_SPEED;
        rotation.y = Mathf.Clamp(rotation.y, VERTICAL_ROTATION_MIN, VERTICAL_ROTATION_MAX);
    }

    private void RotateCamera()
    {
        Quaternion verticalRotation = Quaternion.AngleAxis(rotation.y, Vector3.left);
        transform.localRotation = originalRotation * verticalRotation;
    }

    private void RotatePlayer()
    {
        player.localRotation *= Quaternion.AngleAxis(rotation.x, player.up);
    }
}

Я предоставляю небольшой GIF-файл, показывающий неправильное движение при вращении.

https://media.giphy.com/media/2jMy38g1PjckODc6B0/giphy.gif

При вращении игрока путем вращения камеры игрок вращается правильно вокруг своей оси y.Почему-то он не движется вперед в том направлении, в котором он стоит, он просто движется в одном направлении.

Что нужно исправить?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

это заново изобретать колесо.Пакет ресурсов для универсального стандарта поставляется с префабом fps, который настраивается и работает хорошо.Скрипт надежный, а элементы управления элегантные, с небольшой настройкой - легко сделать его своим, сэкономить немного времени, загрузить пакет Unity Standard Asset из хранилища Unity и использовать префаб char firstperson.тебе будет приятно, я думаю.

0 голосов
/ 30 сентября 2018

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

Если вы хотите сделать«передняя ось» означает «идти вперед в направлении моего взгляда», вы должны объединить движение с вращением камеры.

Вы можете попробовать что-то вроде

rigid.velocity = Camera.main.transform.rotation * movement;

в своем Move ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...