Camera là một khái niệm quen thuộc đối với mọi nền tảng phát triển game, với các thao tác chỉnh sửa và chuyển đổi camera, có thể tạo ra vô số hiệu ứng độc đáo và ứng dụng vào game một cách sinh động và hấp dẫn, thu hút nhiều người chơi.
Các khái niệm cơ bản
Projection
Có 2 loại phép chiếu của camera:
- Orthographic: phép chiếu song song, được sử dụng trong các game 2D, các đối tượng sẽ được vẽ đúng tỉ lệ dù ở bất kỳ khoảng cách nào của chiều sâu.
- Perspective: phép chiếu phối cảnh, được ứng dụng trong game 3D, mô phỏng lại thế giới thực của con người. Các vật thể càng ở xa thì tỉ lệ hình ảnh sẽ càng nhỏ và ngược lại.
Field of view (fov)
Là góc mở của camera Perspective. Đối với Orthographic camera, tham số này sẽ được bỏ qua. Fov
được mô tả thông qua hình minh hoạ sau:

Với cùng 1 đối tượng và 1 vị trí, nếu fov
càng lớn, đối tượng sẽ càng nhỏ và ngược lại. Đây là đặc điểm thú vị và được ứng dụng trong việc tạo hiệu ứng zoom trong môi trường 3D.
Near - Far
Near và Far là hai mặt phẳng cắt, quy định khoảng nhìn thấy của camera tính theo chiều sâu. 1 vật muốn được hiển thị phải nằm trong phạm vi nhìn thấy của camera, bao gồm cả khoảng cách từ camera đến vật đó. Nếu quá gần hoặc quá xa, camera sẽ không thu được hình ảnh để hiển thị lên màn hình.
Camera trong Unity
Tuỳ chỉnh tại Inspector

Tại Inspector, có thể chỉnh sửa các thuộc tính minh hoạ ở trong hình. Chi tiết 1 số thuộc tính thường dùng:
Clear Flag
: quy định cách thức xoá các đối tượng. Trong 3D game tuỳ chọn Skybox thường được sử dụng và tuỳ chọn Solid color đối với game 2D.Background
: màu nền sau khi các đối tượng đã được render.Culling Mask
: quy định các layer sẽ được vẽ hoặc ẩn đi.Projection
: chọn phép chiếu cho camera.Size
: kích thước của camera. Tuỳ chọn này chỉ có khi phép chiếu được chọn là Orthographic.Field of view
: góc đo tính bằng độ, là góc đo chiều rộng góc nhìn của Camera.Clipping Planes
: bao gồm 2 thuộc tính Near và Far. Là khung nhìn thấy của camera.Viewport Rect
: kích thước của camera và vị trí của nó trên màn hình. Các giá trị này sử dụng hệ toạ độ Screen Coordinate (giới thiệu ở phần dưới).
Một số thao tác trong C# Script
Thông thường, các thuộc tính quy định tính chất của camera sẽ ít khi được chỉnh sửa trong script. Tuy nhiên, có thể thay đổi chúng trong Runtime để tạo ra các hiệu ứng như Camera Zoom, thay đổi màu sắc Background qua từng màn chơi, …
1 số thuộc tính chính của Camera:
Thuộc tính | Chức năng |
---|---|
main | Trả về đối tượng camera đầu tiên được gắn tag "MainCamera". |
allCameras | Trả về tất cả các đối tượng camera đang được kích hoạt. |
allCamerasCount | Số lượng camera trong scene hiện tại. |
aspect | Tỉ lệ màn hình, tính bằng công thức aspect = width / height. |
backgroundColor | Màu nền. |
clearFlags | Cờ quy định việc xoá camera sau mỗi frame. |
fieldOfView | Góc nhìn của camera, sử dụng cho phép chiếu Perspective. |
orthographicSize | Kích thước camera, sử dụng với phép chiếu Orthographic. |
cameraToWorldMatrix | Ma trận 4x4 biến đổi toạ độ trong không gian camera sang toạ độ thế giới game. |
worldToCameraMatrix | Ma trận 4x4 biến đổi toạ độ thế giới game sang toạ độ trong không gian camera. |
Các hệ toạ độ trong Unity
World Coordinate
Là hệ toạ độ của thế giới thực trong game. Hệ toạ độ này tuân theo quy tắc bàn tay trái:
- Chiều x dương là bên phải.
- Chiều y dương hướng lên trên.
- Chiều z dương hướng vào bên trong màn hình.
Toạ độ của đối tượng được thể hiện trong thành phần Transform
chính là toạ độ trong World coordinate.
Các đối tượng con còn có 1 toạ độ khác được lưu trữ tại các thuộc tính localPosition
, localRotation
và localScale
của Transform.
Viewport Coordinate
Là hệ toạ độ của camera. Trong Unity, các trục toạ độ của World space và Viewport space trùng nhau, nhưng khác nhau về đơn vị của các trục.
Trong camera, góc dưới bên trái có toạ độ (0, 0)
, góc trên bên phải có toạ độ (1, 1)
.
Các giá trị này có thể được chỉnh sửa thông qua Viewport Rect trong Inspector của đối tượng Camera.
Screen Coordinate
Screen Coordinate là hệ toạ độ của màn hình hiển thị.
Đơn vị của các trục là pixel.
- Góc dưới bên trái màn hình có toạ độ
(0, 0)
. - Góc trên bên phải là
(screenWidth – 1, screenHeight – 1)
.
UI Coordinate
Là hệ toạ độ của các đối tượng UI, giá trị của các trục toạ độ sẽ nằm trong khoảng (0, 1)
.
- Góc trên bên trái có toạ độ
(0, 0)
. - Góc dưới bên phải là
(1, 1)
.
Chuyển đổi giữa các hệ toạ độ trong Unity
Trong khi thao tác với các đối tượng thông qua script, nhiều trường hợp nhận được input từ các sự kiện click chuột, touch,… và dùng nó để thao tác với các đối tượng. Thông thường các sự kiện này sẽ trả về toạ độ của Screen space. Vậy làm sao có thể chuyển đổi sang World space để thao tác được với các đối tượng chính xác?
Unity hỗ trợ sẵn các hàm chuyển đổi giữa các Coordinate system. Các hàm này được gắn vào camera chính đang được sử dụng (trong trường hợp game có nhiều hơn 1 camera):
Camera.WorldToScreenPoint
Camera.WorldToViewportPoint
Camera.ScreenToViewportPoint
Camera.ScreenToWorldPoint
Camera.ViewportToScreenPoint
Camera.ViewportToWorldPoint
Các hàm trên sẽ nhận vào 1 Vector3
và trả về 1 Vector3
tương ứng với hệ toạ độ cần chuyển.
2 thao tác liên tiếp hỗ trợ việc chuyển từ Ui sang Screen Coordinate và ngược lại.
GUIUtility.ScreenToGUIPoint
GUIUtility.GUIToScreenPoint