Góc Euler
Thuộc phần Vật lý và lối chơi trong hành trình Unity của Coddy. Bài học 42 trên 71.
transform.eulerAngles biểu thị góc quay của một đối tượng bằng ba góc tính theo độ quanh trục x, y và z. Unity lưu góc quay dưới dạng quaternion (trong bài học tiếp theo) và tính lại ba góc mỗi khi bạn đọc chúng, luôn cho ra giá trị từ 0 đến 360. Hãy nghiêng tấm ván quanh trục z một góc -10 độ rồi đọc lại:
transform.rotation = Quaternion.Euler(0, 0, -10);
Debug.Log(transform.eulerAngles.z); // 350Bạn đặt góc là -10, nhưng code đọc được 350, nên if (transform.eulerAngles.z < -5) không bao giờ đúng. Khi đọc lại, cả ba số đều có thể thay đổi: đặt (100, 0, 0), bạn sẽ đọc được (80, 180, 180), cùng một hướng nhưng được biểu diễn theo cách khác. Quaternion.Euler(x, y, z) hoạt động theo chiều ngược lại và nhận mọi góc: -10, 350 và 710 đều tạo ra cùng một góc quay. Vì vậy, hãy lưu góc trong một float riêng, thay đổi và giới hạn góc ở đó, rồi đặt toàn bộ góc quay dựa trên giá trị đó. Bập bênh này nghiêng theo các phím mũi tên và dừng ở góc 20 độ theo cả hai hướng:
public float speed = 40f;
float tilt;
void Update()
{
tilt += Input.GetAxisRaw("Horizontal") * speed * Time.deltaTime;
tilt = Mathf.Clamp(tilt, -20f, 20f);
transform.rotation = Quaternion.Euler(0, 0, tilt);
}Đừng thay đổi riêng một phần trong các góc bạn đọc được. transform.eulerAngles.x = 110; không biên dịch được (CS1612, giống như với position.x), còn việc sao chép eulerAngles, thay đổi x rồi gán bản sao trở lại sẽ bắt đầu từ các góc theo cách Unity biểu diễn chúng. Sau khi đặt (100, 0, 0), bản sao có giá trị (80, 180, 180); cộng 10 vào x, bạn sẽ được (90, 180, 180), khiến đối tượng quay lại 90 độ thay vì tiếp tục đến 110 độ.
Thử thách
Trung bìnhSửa chuyển động quét của camera: camera quay lại ở 45 nhưng không quay lại ở -45, vì eulerAngles.y đọc -45 thành 315.
- Thêm trường
float angle;và thay hai dòng đầu tiên củaUpdate()bằngangle += direction * speed * Time.deltaTime;. - Giữ nguyên hai dòng
if, rồi đặt toàn bộ góc quay:transform.rotation = Quaternion.Euler(tilt, angle, 0);.
Nhấn Chơi: camera quét từ 45 đến -45 rồi quay lại, hướng chúc xuống. Sau đó nhấn Kiểm tra.
Tự làm thử
using UnityEngine;
public class Sweep : MonoBehaviour
{
public float speed = 30f;
public float limit = 45f;
public float tilt = 20f; // nghiêng xuống theo độ, quanh trục x
float direction = 1f;
void Update()
{
transform.Rotate(0, direction * speed * Time.deltaTime, 0, Space.World);
float angle = transform.eulerAngles.y;
if (angle > limit) direction = -1f;
if (angle < -limit) direction = 1f;
}
}
Tất cả bài học trong Vật lý và lối chơi
1Rigidbody
Trọng lực và khối lượngĐẩy bằng AddForceNhảy bằng xung lựcFixedUpdate cho vật lýVận tốcVật thể động họcÔn tập: Bệ phóng4Coroutine
InvokeInvokeRepeating, CancelInvokeCoroutine đầu tiên của bạnVòng lặp trong CoroutineDừng CoroutineÔn tập: đếm ngược10Dự án: Thoát khỏi đấu trường
Đấu trườngThợ săn2Va chạm
OnCollisionEnterMình đã va chạm với gì?Vỡ khi va chạmĐứng trên mặt đấtĐộ nảy và ma sátHình dạng colliderÔn tập: Tường có thể phá vỡ5Dự án: Cuộc đua thu thập xu
Quả bóng lănThu thập xuTự luyện tập: Playground Unity