У меня есть игра Unity, и я хочу, чтобы мой игрок двигался относительно камеры - PullRequest
0 голосов
/ 17 апреля 2020

Вот мой код. В настоящее время игрок движется вперед относительно плоскости фиксации. Поворот плеера / камеры не влияет на то, в каком направлении они движутся, когда я нажимаю клавишу «go вперед».

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MainController : MonoBehaviour
{
    public float speed;
    float jumpSpeed = 0.5f;
    bool isGrounded;
    private Rigidbody rb;
    public GameObject player;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void Update()
    {

    }

    void FixedUpdate()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

        if (Input.GetButtonDown("Jump") || Input.GetAxis("Right Trigger") > 0f && isGrounded)
        {
            rb.AddForce(Vector3.up * jumpSpeed, ForceMode.Impulse);
            isGrounded = false;
        }

        if (isGrounded)
        {
            rb.AddForce(movement * speed * Time.deltaTime);
        }
        else
        {
            rb.AddForce((movement/4) * speed * Time.deltaTime);
        }
    }

    void OnCollisionStay()
    {
        isGrounded = true;
    }
    void OnCollisionExit()
    {
        isGrounded = false;
    }
}

Как мне сделать так, чтобы игрок двигался относительно направления камеры?

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

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

void FixedUpdate()
{
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");

    Vector3 looking = (transform.rotation * Vector3.forward).normalized;

    Vector3 perpendicular = Vector2.Perpendicular(new Vector2(looking.x, looking.z));
    perpendicular.z = perpendicular.y;
    perpendicular.y = looking.y;

    Vector3 vertical = moveVertical * looking;
    Vector3 horizontal = moveHorizontal * perpendicular;

    Vector3 movement = vertical - horizontal;

    ...
}
0 голосов
/ 17 апреля 2020

Это потому, что RigidBody.AddForce() добавляет силу в абсолютном направлении, независимо от того, в каком направлении смотрит игровой объект.

Вам следует попробовать использовать RigidBody.AddRelativeForce (), как:

if (isGrounded)
{
    rb.AddRelativeForce(movement * speed * Time.deltaTime);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...