[Hướng Dẫn] Hướng dẫn quay Camera ngay trong game.

PiratePirate Posts: 31Registered
edited August 2019 in Unity
Lâu rồi mình mới quay lại TTC ::)) Lần này thấy mọi người có làm Unity, thấy vui vui, mình chia sẻ 1 code mình làm. 

Game mình đang làm là game Rubik. 14407827_1320935897930239_766073856_opngoh392c79c79a7d2a354506c42793a9b9eboe57E171A5.

Trong game này, để tiện xoay rubik, mình cho phép người chơi xoay cục rubik ngay trong game, gần giống với cách mọi người xoay scene trong game. Và mình xin bắt đầu.

I. Lưu ý về cách hoạt động của Object và con Object.

Trong Hierachy, có một vài vật có các quan hệ với nhau. Có thể thông qua Script của Unity (hệ thống script Joint của Unity là một ví dụ), Script của riêng bạn. Nhưng có một cách vô cùng đơn giản để kết nối chúng. Đó chính là tạo mối quan hệ Parent và Child.

14397331_1321598847863944_1444658891_npngoh82df506b0b345d57e0c758452d97b08boe57E2744A
Trong hình này, object tên Camera là con của Camera Controller.

Vậy mối quan hệ này như thế nào? Ai đã từng code Unity ít nhất biết đến Transform, một Component cơ bản của tất cả Object. Thông qua Transform ở giao diện Editor cơ bản, ta điều chỉnh được Position (vị trí vật), Rotation (hướng của vật) và Scale (độ phóng to) của vật.

Khi tạo mối quan hệ giữa 2 vật, child của vật cũng sẽ bị ảnh hưởng bởi Transform của vật. Ví dụ:

https://scontent-hkg3-1.xx.fbcdn.net/v/t34.0-12/14389906_1321608151196347_1457018219_n.png?oh=ef6d3cc52f5f5bc51a3272ce32be674a&oe=57E140CE

Trong hình, hình trụ là con của hình cầu. Khi dịch chuyển hình cầu, ta cũng di chuyển luôn hình trụ.

14398058_1321608831196279_1373536438_npngoh0d916dd8eff9edb9a5434bd492b52c80oe57E21CBB

Khi Scale hình cầu, ta cũng scale luôn hình trụ.

14389914_1321609587862870_1328552727_npngohe9aca47bb898a72c4a093c6d713fbbe3oe57E23A3E

Áp dụng việc này ta được gì? Ta có thể giảm thiểu code rất nhiều. Ví dụ, ta có một nhân vật đang đi trên đường cầm quả táo trên tay. Bằng câu lệnh đơn giản:
Apple (tên game object).transform.SetParent(Hand.transform); //Câu lệnh tạo mối quan hệ bằng code.
Root của một object, được hiểu là ông tổ của object, khi mà nó không có cha. Để thực hiện việc này, ta chỉ cần đặt.
Object.transform.parent = null;
Quả táo sẽ đi theo vị trí bàn tay của chúng ta.

Bằng việc tương tự, nếu ta gắn Camera làm Child của một Object, Camera sẽ đi theo nhân vật đó.

14397991_1321613907862438_1199394573_npngohd892ab326a05ddab27c4c03944b20a68oe57E23B26

Ví dụ: Đưa vào game đua xe. Ta sẽ không phải cập nhật liên tục vị trí của camera đi theo xe. Tương tự với các game khác.

Tuy nhiên, không phải lúc nào đặt parent như thế cũng tốt. Ví dụ, trong game đua xe, bạn muốn camera luôn nhìn về phía trước, mà xe của bạn quẹo, xoay theo rotation. Khi thế, camera sẽ xoay theo, nhìn hướng khác. Hoặc như hướng dẫn hôm nay, camera đi theo nhân vật, nhưng hướng nhìn lại thoải mái, bạn sẽ làm thế nào? Phần sau sẽ rõ.

II. Hiểu một ít về Vector3 và Transform Vector

Đã đụng đến Transform thì phải đụng đến Vector3. Vector3 là class có 3 giá trị cơ bản x, y, z, tương ứng cho 3 trục trong không gian Oxyz.

Vector3 có một vài Vector đặc biệt, đại diện cho các vector thường dùng. Bao gồm:

Vector3.zero (0, 0, 0) Vector3.one (1, 1, 1)
Vector3.left (-1, 0, 0) Vector3.right(1, 0, 0)
Vector3.down (0, -1, 0) Vector3.up (0, 1, 0)
Vector3.back (0, 0, -1) Vector3.forward (0, 0, 1)

Chúng có thể dùng nhanh trong khá nhiều trường hợp. Ví dụ: Vector3.zero đại diện cho tâm O của hệ, hoặc vị trí của transform.parent. Vector3.one * a để phóng to, thu nhỏ. Vân vân
6 vector3 còn lại, đại diện cho 6 hướng của 3 axis trong không gian.

Bây giờ, một bài toán được đưa ra, giả sử, bạn có một hình chữ nhật, và nó bị xoay bởi rotation. Làm thế nào để xác định được vectơ pháp tuyến của hình? Làm thế nào lấy được vectơ đi dọc theo 4 cạnh của hình? Đó là khi chúng ta sử dụng các vector đặc biệt của một Object. Bao gồm:
Transform.right
Transform.up
Transform.forward
Nó sẽ tương ứng với 3 axis vector nếu rotation của vật là bằng không.

Vậy ta có thể áp dụng được gì từ 3 vector này. Ta có thể cho một vật đi thẳng về phía nó nhìn thấy bằng câu lệnh:
transform.position += transform.forward * Time.deltaTime;
Hoặc như bài toán cho trước, ta có thể xác định các vectơ đại diện cho hình mà không cần phải tính toán dựa vào Rotation.

Từ phần tiếp theo, chúng ta sẽ bắt đầu thực hiện code.

Comments

Sign In or Register to comment.