Не удается заставить мою камеру правильно ограничить вращение - PullRequest
0 голосов
/ 12 сентября 2018

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

Каждый раз, когда я добавляю зажим, такой как в моем коде, камера не хочет перемещать еговращение на 0,0,0 дальше чем Input.GetAxisRaw говорит, что мышь движется.

Я пытался использовать операторы if как ручные зажимы, но он либо постоянно остается на уровне 0,0,0, либо -75,0,0 постоянно, если я переключаю полярность.

Я пытался заменить камеру, если она была связана с ее настройками, но ничего не изменилось.

Я не хотел публиковать это, потому что это не должно быть так сложно, но я потратил несколько дней на это, и у меня нет выбора;Любые идеи приветствуются.

Я использую Visual Studio в качестве редактора.

using UnityEngine;

public class PlayerMove : MonoBehaviour {

    Rigidbody rb;

    public Camera cam;
    public Transform camTrans;

    Vector3 movement;
    Vector3 rotation;

    public float sensitivityX;
    public float sensitivityY;
    public float playerSpeed;
    public float jumpForce;
    float forward;
    float sideways;

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

    void FixedUpdate ()
    {
        forward = Input.GetAxisRaw("Vertical");
        sideways = Input.GetAxisRaw("Horizontal");
        movement = new Vector3 (forward, 0, -sideways).normalized;

        float _xRot = Input.GetAxisRaw("Mouse Y");
        float _yRot = Input.GetAxisRaw("Mouse X");

        rotation = new Vector3(0f, _yRot, 0f) * sensitivityX;

        float _jump = Input.GetAxisRaw("Jump");

        if (movement != Vector3.zero)
        {
            MovePlayer();
        }
        if (rotation != Vector3.zero && Input.GetAxisRaw("Fire2") != 0 || _xRot != 0 && Input.GetAxisRaw("Fire2") != 0)
        {
            Rotate(-_xRot);
        }
        if (_jump != 0f)
        {
            Jump();
        }
    }

    void MovePlayer()
    {
        float _playerSpeed;
        _playerSpeed = playerSpeed * 0.1f;
        transform.Translate(movement * _playerSpeed * Time.fixedDeltaTime, Space.Self);
    }

    void Jump()
    {
        if (IsGrounded())
        {
            rb.AddForce(new Vector3(0, 1 * jumpForce, 0), ForceMode.Impulse);
        }
    }

    void Rotate(float _camRot)
    {
        camTrans.Rotate(new Vector3(_camRot * sensitivityY, 0, 0));
        float _camPosX = camTrans.rotation.x;
        Mathf.Clamp(_camPosX, -75, 50);
        camTrans.rotation = Quaternion.Euler(new Vector3(_camPosX, 0, 0));
        rb.MoveRotation(rb.rotation * Quaternion.Euler(rotation * sensitivityX));
    }

    bool IsGrounded()
    {
        RaycastHit hit;
        return Physics.Raycast(transform.position, Vector3.down, out hit, 1.001f);
    }
}

1 Ответ

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

Input.GetAxisRaw("Mouse Y"); возвращает количество единиц, перемещенных мышью (см. Документация Unity - Input.GetAxisRaw ).

Когда вы перемещаете мышь, скрипт работает, но потому что void Rotate() вызывается каждый кадр в функции Update(), после некоторых кадров Input.GetAxisRaw("Mouse Y");возвращает 0, а затем _camRot = 0.

Итак, camTrans.rotation = Quaternion.Euler(new Vector3(0, 0, 0)); и поскольку Update() вызывается несколько раз в секунду, мы думаем, что камера постоянно остается на 0,0,0.

Для фиксацииВращение, вы можете изменить свой код на это:

public class PlayerMove : MonoBehaviour 
{
    ...

    private float rotationX;

    ...

    void Rotate(float _camRot)
    {
        rotationX += _camRot * sensitivityY;
        rotationX = Mathf.Clamp(rotationX, -75, 50);
        camTrans.localEulerAngles = new Vector3(rotationX, camTrans.localEulerAngles.y, camTrans.localEulerAngles.z);

        rb.MoveRotation(rb.rotation * Quaternion.Euler(rotation * sensitivityX));
    }
}

Я надеюсь, что это поможет вам.

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