Làm cách nào để sử dụng Input.GetAxis (Chuột Chuột X / Y) để xoay camera?


13

Tôi muốn làm một máy ảnh người đầu tiên xoay bằng chuột.

Tôi đã xem trang API Script.GetAxis và tìm thấy một mã mẫu, mà tôi đã đưa vào cuối bài viết của mình. Khi dùng thử, tôi nhận ra rằng mặc dù nó có chức năng cơ bản giống như tôi hy vọng nó sẽ có, nhưng nó không giữ máy ảnh song song với mặt phẳng xz, đặc biệt là khi di chuyển chuột theo vòng tròn. Sau một thời gian, máy ảnh sẽ ở một góc kỳ lạ, và người chơi sẽ hoàn toàn thất vọng!

Có một sửa chữa nhanh chóng cho mã này sẽ hạn chế chuyển động của máy ảnh bằng cách nào đó, hoặc có cách nào tốt hơn để xoay máy ảnh?

 using UnityEngine;
 using System.Collections;

     public class ExampleClass : MonoBehaviour {
         public float horizontalSpeed = 2.0F;
         public float verticalSpeed = 2.0F;
         void Update() {
             float h = horizontalSpeed * Input.GetAxis("Mouse X");
             float v = verticalSpeed * Input.GetAxis("Mouse Y");
             transform.Rotate(v, h, 0);
         }
     }

Những gì bạn đang trải nghiệm âm thanh như khóa gimbal. Nó xảy ra khi bạn đang sử dụng các góc euler để xoay. Tôi phải làm một số thử nghiệm để đưa ra giải pháp. Về cơ bản, bạn cần sử dụng tứ phương. Họ không bị khóa gimbal.
Logic mờ

Làm thế nào tôi có thể sử dụng một tứ phương để làm luân chuyển? Tôi đã thử biến đổi.rotation = Qu Parention.Slerp (-Input.GetAxis ("Mouse X"), Input.GetAxis ("Mouse X"), Time.deltaTime * freeLookTurnSpeed); , nhưng điều đó đã cho tôi lỗi.
tái

Ok, tôi đã làm một bài kiểm tra. May mắn thay, nó không phải là khóa gimbal. Tôi sẽ đăng giải pháp như một câu trả lời cho bạn.
Logic mờ

Câu trả lời:


18

Vấn đề là bạn đang cập nhật vòng quay hiện tại thay vì tự mình theo dõi và thay thế nó mỗi lần cập nhật.

Khi bạn cập nhật vòng quay, nó kết hợp vòng quay mới của bạn với vòng quay cũ dẫn đến hành vi không mong muốn.

Giải pháp là theo dõi vòng quay tích lũy của bạn và đặt lại vòng quay hoàn toàn mỗi lần cập nhật với các giá trị mới của bạn.

Tín dụng khi đến hạn, tôi đã tìm thấy câu trả lời ở đây: Unity Đáp án: how-to-lock-or-set-the-camera-z-rotation-to-zero

Mã làm việc:

using UnityEngine;
using System.Collections;

public class FirstPersonCam : MonoBehaviour {

    public float speedH = 2.0f;
    public float speedV = 2.0f;

    private float yaw = 0.0f;
    private float pitch = 0.0f;

    void Update () {
        yaw += speedH * Input.GetAxis("Mouse X");
        pitch -= speedV * Input.GetAxis("Mouse Y");

        transform.eulerAngles = new Vector3(pitch, yaw, 0.0f);
    }
}

Sự khác biệt chính:

  • Lưu trữ ngáp và cao độ như các thành viên của lớp, thay vì các biến phương thức cục bộ để bạn có thể theo dõi các giá trị tích lũy.
  • Sử dụng + = và / hoặc - = để tích lũy mỗi bản cập nhật.
  • Sử dụng eulerAngles (để ghi đè giá trị xoay vòng mỗi bản cập nhật) thay vì Xoay (áp dụng xoay vòng mới của bạn lên cái cũ).

Chào mừng bạn Nếu giải pháp này tôi đã đăng giải quyết vấn đề ban đầu bạn đang gặp phải, bạn nên chấp nhận nó như là câu trả lời. Nếu bạn muốn được giúp đỡ với vấn đề mới của mình, bạn nên đăng một câu hỏi mới để giữ mọi thứ gọn gàng hơn và nhiều khả năng người khác có thể giúp bạn hoặc tìm câu hỏi của bạn nếu họ gặp vấn đề tương tự. Các khu vực bình luận không có nghĩa là cho hộp thoại mở rộng. Chúc mừng.
Logic mờ

0

Điều gì sẽ xảy ra nếu bạn tạo camera con của một gameobject trống. Sau đó, với một tập lệnh, bạn quản lý xoay vòng trò chơi trống tương ứng với vectơ UP.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.