STDIO
Tìm kiếm gần đây

    Nội dung

    Cơ Bản Về Camera Trong Unity

    08/08/2015
    23/04/2016
    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, chúng ta 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.

    Giới thiệu

    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, chúng ta 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. Bài viết này sẽ giúp các bạn hiểu được các thông số của một camera trong Unity, cùng với một số thao tác thường sử dụng với camera.

    Các khái niệm cơ bản

    Projection

    Góc chiếu của camera. Đối với các loại camera trong game thì có hai loại phép chiếu:

    • Phép chiếu song song – Orthographic.
    • Phép chiếu xa gần – Perspective.

    Orthographic đượ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 đượ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:

    Mô tả Fov

    Với cùng một đối tượng và một vị trí, nếu fov càng lớn, đối tượng sẽ càng nhỏ và ngược lại. Đây là một đặ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. Một 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

    ss_2

    Tại Inspector, chúng ta có thể chỉnh sửa các thuộc tính minh hoạ ở trong hình. Chi tiết một số thuộc tính thường dùng như sau:

    • 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. Bạn đọc có thể xem thêm về cách tạo layer qua bài viết GameObject - Thao Tác Với C# Script.
    • 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 hai thuộc tinh là 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, ta hoàn toà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, … Các hiệu ứng này là đặc thù của từng game nên tôi sẽ chỉ liệt kê một số thuộc tính chính của Camera để bạn tham khảo. Chi tiết các bạn có thể xem thêm trong đường dẫn ở cuối bài viết.

    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ó một 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) trong khi 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) và 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 ta 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 chúng ta có thể chuyển đổi sang World space để thao tác được với các đối tượng một cách chính xác?

    Unity hỗ trợ sẵn cho chúng ta 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 một Vector3 và trả về một Vector3 tương ứng với hệ toạ độ cần chuyển.

    Đối với UI Coordinate, Unity hỗ trợ chuyển từ UI sang Screen Coordinate và ngược lại. Do đó chúng ta có thể sẽ cần thực hiện hai thao tác liên tiếp để thực hiện được điều cần thiết. Các hàm đó như sau:

    • GUIUtility.ScreenToGUIPoint
    • GUIUtility.GUIToScreenPoint

    Tham khảo

    • http://docs.unity3d.com/ScriptReference/Camera.html - 23/08/2015.
    • http://docs.unity3d.com/Manual/class-Camera.html - 23/08/2015.

    Bài viết liên quan

    Ứng Dụng Của StartCoroutine Trong Unity

    Khi tiếp nhận và xử lý các sự kiện thu được, có những lúc chúng ta cần một khoảng thời gian chờ giữa việc nhận được sự kiện và xử lý sự kiện. Có khá nhiều những trường ...

    Rye Nguyen08/08/2015

    Hiệu Ứng Camera Zoom Trong Unity

    Hiệu ứng Camera Zoom là một hiệu ứng được sử dụng nhiều trong các game hiện nay. Hiệu ứng này được ứng dụng trong những đoạn cắt cảnh game, những đoạn tập trung vào một ...

    Rye Nguyen05/08/2015

    Hiệu Ứng Camera Shake Trong Unity

    Đối với các game hành động nhập vai, các hiệu ứng âm thanh hấp dẫn, hiệu ứng về ánh sáng, sự kịch tính, yếu tố bất ngờ, ... đóng vai trò không nhỏ trong sự thành công của ...

    Rye Nguyen06/08/2015

    Các Thành Phần Cơ Bản Trong Unity

    Các thành phần, component cơ bản trong Unity thường được sử dụng để phát triển game với Unity.

    Unity Game01/08/2015

    Làm Quen Với Unity IDE

    Unity là một trong những game engine khá phổ biến, tích hợp sẵn một IDE rất mạnh mẽ nhưng cũng không kém phần tiện dụng cho những nhà phát triển game. Bài viết hướng dẫn ...

    Rye Nguyen01/08/2015

    Cú Pháp Cơ Bản Trong Python

    Trong bài viết ngày hôm nay, tôi sẽ cùng các bạn làm quen với những vấn đề cơ bản nhất của cú pháp trong Python. Về cơ bản thì Python có khá nhiều điểm tương đồng với các ...

    Ryan Lê18/03/2015

    Hiện Thực Game Zero Với Unity - Phần 1 - Nhận Sự Kiện Button

    Tôi tiếp tục chuỗi bài viết giúp bạn đọc xây dựng một game đơn giản thực tế: Hướng Dẫn Hiện Thực Game Zero Với Unity. Qua chuỗi bài viết, hi vọng bạn đọc sẽ dễ dàng hơn ...

    Rye Nguyen09/08/2015

    Xử Lý Toán Học Trong Unity

    Toán học rất quan trọng trong việc phát triển game, cho dù là ở bất cứ nền tảng nào. Đối với Unity, lập trình viên được cung cấp khá nhiều các hàm toán học hỗ trợ lập ...

    Lê Thắm29/03/2016

    GameObject - Thao Tác Với C# Script

    GameObject là một khái niệm cơ bản trong Unity. Mọi đối tượng trong game được hiển thị trong cửa sổ Hierarchy đều là các GameObject. Các loại đối tượng khác nhau sẽ có ...

    Rye Nguyen08/08/2015

    Nhập Xuất Cơ Bản Trong C++

    Đối với mọi ngôn ngữ lập trình, thao tác nhập/xuất dữ liệu luôn là thao tác cơ bản và quan trọng mà mỗi lập trình viên cần nắm rõ. Bài viết này sẽ cung cấp kiến thức cơ ...

    Rye Nguyen03/08/2015

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    [email protected]

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020