Tạo trò chơi thực tế tăng cường bằng AR Foundation của Unity

1. Tổng quan

ARCore là khung của Google để tạo trải nghiệm thực tế tăng cường trên điện thoại thông minh. Bạn có thể dùng AR Foundation của Unity để tạo các ứng dụng thực tế tăng cường nhiều nền tảng.

Sản phẩm bạn sẽ tạo ra

Trong lớp học lập trình này, bạn sẽ tạo một trò chơi đơn giản bằng AR Foundation. Mục tiêu của trò chơi là thu thập các gói hàng bằng một chiếc ô tô mà bạn điều khiển bằng thiết bị cầm tay.

Tuy nhiên, điều này sẽ không xảy ra trong một thế giới hoàn toàn ảo! Bạn sẽ kết hợp các nguyên tử vật chất và bit kỹ thuật số để tạo ra một loại trải nghiệm mới cho người chơi bằng cách tạo một trò chơi có thể hiểu được môi trường xung quanh người chơi.

Khi kết thúc lớp học lập trình này, trò chơi của bạn sẽ có thể:

  • Phát hiện các mặt phẳng trong thế giới thực và vẽ một sân chơi lên đó.
  • Truyền các tia từ chế độ xem của camera và phát hiện các giao điểm với mặt phẳng.
  • Phản ứng với điều kiện ánh sáng trong thế giới thực để tăng thêm tính chân thực cho trò chơi.

Kiến thức bạn sẽ học được

  • Cách thiết lập một dự án sử dụng AR Foundation của Unity.
  • Cách sử dụng ARPlaneManager để đăng ký nhận thông tin về các máy bay mới.
  • Cách sử dụng Raycast để tìm giao điểm với hình học ảo
  • Cách sử dụng ARLightEstimationData để chiếu sáng cảnh.

Bạn cần có

2. Thiết lập môi trường phát triển

Ở bước này, bạn sẽ chuẩn bị môi trường để phát triển bằng AR Foundation của Unity.

Đảm bảo thiết bị của bạn tương thích với AR

Các trải nghiệm thực tế tăng cường trên thiết bị Android được hỗ trợ bởi ARCore. ARCore có trên các thiết bị hỗ trợ ARCore. Đảm bảo thiết bị phát triển của bạn tương thích với thực tế tăng cường. Ngoài ra, bạn có thể sử dụng một phiên bản Trình mô phỏng Android tương thích với AR được định cấu hình đúng cách.

Thiết lập tính năng gỡ lỗi qua USB trên thiết bị

Bạn cần bật Tùy chọn cho nhà phát triển trên thiết bị để chạy các ứng dụng gỡ lỗi. Nếu bạn chưa làm việc này, hãy tham khảo tài liệu Android về cách Bật tuỳ chọn cho nhà phát triển và tính năng gỡ lỗi qua USB.

Cài đặt Unity (2020.3 LTS)

Trên máy trạm, hãy cài đặt Unity 2020 LTS. Trong lớp học lập trình này, ảnh chụp màn hình sẽ cho thấy giao diện người dùng của Unity ở phiên bản 2020.3 (LTS). Các phiên bản khác của Unity có thể hoạt động nhưng có thể yêu cầu thêm một số bước. Giao diện này có thể khác với ảnh chụp màn hình được minh hoạ ở đây.

Tạo dự án mới

Tạo một dự án mới bằng mẫu Universal Render Pipeline (Quy trình kết xuất chung). Đặt tên mô tả và chọn vị trí thích hợp cho tệp, rồi nhấn vào TẠO.

Cài đặt các khung hình bắt buộc

Bạn có thể tìm thấy AR Foundation của Unity trong Unity Package Manager.

  1. Mở cửa sổ này bằng cách nhấp vào Window > Package Manager (Cửa sổ > Trình quản lý gói).

  1. Trong cửa sổ này, hãy cài đặt các gói mà bạn sẽ sử dụng trong lớp học lập trình này. Xem phiên bản mới nhất của các khung này bằng cách mở rộng mục nhập của khung bằng biểu tượng . Cài đặt phiên bản mới nhất cho từng khung hình sau:
    • AR Foundation
    • Trình bổ trợ ARCore XR

Khi bạn hoàn tất, Trình quản lý gói sẽ có dạng như sau:

Cài đặt gói khởi động

Trong lớp học lập trình này, chúng tôi đã cung cấp một gói khởi đầu chứa các thành phần và tập lệnh dựng sẵn giúp đẩy nhanh một số phần của lớp học lập trình để bạn có thể tập trung vào cách sử dụng AR Foundation.

  1. Cài đặt gói khởi động bằng cách mở Assets > Import Package > Custom Package... (Thành phần > Nhập gói > Gói tuỳ chỉnh) rồi mở starter-package.unitypackage.
  2. Trong cửa sổ bật lên, hãy đảm bảo bạn đã chọn tất cả.
  3. Nhấp vào Nhập.

Thay đổi chế độ cài đặt bản dựng

Vì ứng dụng sẽ chạy trên Android, hãy thay đổi nền tảng bản dựng thành Android:

  1. Mở File > Build Settings (Tệp > Cài đặt bản dựng).
  2. Trong ngăn Platform (Nền tảng), hãy chọn Android.
  3. Bạn có thể bật Bản dựng phát triểnGỡ lỗi tập lệnh để giữ lại thông tin gỡ lỗi trong khi ứng dụng của bạn chạy.
  4. Nhấp vào Chuyển nền tảng.

Thay đổi chế độ cài đặt dự án

Bạn cần định cấu hình AR Foundation để khởi động các hệ thống XR khi khởi động.

  1. Mở Edit > Project Settings... (Chỉnh sửa > Cài đặt dự án...) rồi nhấp vào phần XR Plug-in Management (Quản lý trình bổ trợ XR).
  2. Trong thẻ Android, hãy bật ARCore.

  1. Trong ngăn bên trái, hãy nhấp vào mục Trình phát.
  2. Trong thẻ Android, trong phần Other Settings (Các chế độ cài đặt khác), hãy xoá Vulkan khỏi Graphics APIs (API đồ hoạ).

  1. Các ứng dụng bắt buộc phải có AR sử dụng ARCore yêu cầu cấp độ API tối thiểu là 24. Di chuyển xuống và tìm Cấp độ API tối thiểu. Đặt cấp độ API tối thiểu thành 24.

Thêm các phần tử bắt buộc của cảnh

Mẫu Universal Render Pipeline (Quy trình kết xuất chung) đi kèm với một số đối tượng trò chơi mà bạn sẽ không sử dụng trong hướng dẫn này.

  1. Xoá tất cả các đối tượng trò chơi trong SampleScene.

  1. Thêm các đối tượng AR Foundation. Nhấp chuột phải vào ngăn Hierarchy (Hệ thống phân cấp). Sử dụng trình đơn này để thêm:
  • XR > AR Session: Đối tượng này kiểm soát vòng đời của một trải nghiệm thực tế tăng cường.
  • XR > AR Session Origin: Đối tượng này chuyển đổi toạ độ AR thành toạ độ thế giới Unity.
  • Light > Directional Light (Ánh sáng > Ánh sáng định hướng): Cung cấp nguồn sáng để chiếu sáng các đối tượng trong trò chơi.

Hệ phân cấp của bạn sẽ có dạng như sau:

  1. Mở rộng AR Session Origin (Nguồn gốc của phiên thực tế tăng cường) mà bạn đã tạo trong hệ thống phân cấp, rồi chọn đối tượng AR Camera (Camera thực tế tăng cường). Trong trình kiểm tra, hãy thay đổi thẻ của đối tượng thành MainCamera.

Thiết lập quy trình kết xuất

Universal Render Pipeline của Unity cần một thay đổi để tương thích với AR Foundation.

  1. Trong ngăn Project (Dự án), hãy chuyển đến Assets > Settings (Tài sản > Cài đặt) để tìm tài sản ForwardRenderer.

  1. Chọn ForwardRenderer.
  2. Trong ngăn Inspector (Trình kiểm tra), hãy sử dụng Add Renderer Feature (Thêm tính năng của trình kết xuất) để thêm AR Background Renderer Feature (Tính năng trình kết xuất nền AR). Thành phần này sẽ hiển thị nguồn cấp dữ liệu từ camera trong cảnh của bạn.

Xác minh chế độ thiết lập

  1. Đảm bảo thiết bị của bạn đã cắm điện và bật tính năng gỡ lỗi ADB.
  2. Nhấp vào File > Build And Run... (Tệp > Tạo và chạy...) Thao tác này sẽ tải ứng dụng lên thiết bị của bạn và khởi động ứng dụng khi đã cài đặt xong.
  3. Bạn sẽ thấy nguồn cấp dữ liệu từ camera trên màn hình thiết bị.

Trong bước tiếp theo, bạn sẽ bắt đầu thêm chức năng vào ứng dụng.

3. Phát hiện các mặt phẳng trong thế giới thực

Giờ đây, khi đã thiết lập một cảnh cơ bản, bạn có thể bắt đầu phát triển trò chơi. Trong bước này, bạn sẽ phát hiện các mặt phẳng và vẽ chúng vào cảnh.

Thêm một thành phần ARPlaneManager

ARPlaneManager phát hiện ARPlane và tạo, cập nhật cũng như xoá các đối tượng trong trò chơi khi thiết bị thay đổi cách hiểu về môi trường.

  1. Sử dụng ngăn Hierarchy (Hệ phân cấp), tạo một GameObject trống.
  2. Đổi tên thành Driving Surface Manager. Thành phần này sẽ hiển thị các máy bay cho đến khi người chơi chọn một máy bay.
  3. Chọn đối tượng trò chơi mới. Trong ngăn Inspector, hãy nhấp vào Add Component (Thêm thành phần) để thêm AR Plane Manager (Trình quản lý mặt phẳng thực tế tăng cường).

  1. Định cấu hình ARPlaneManager bằng cách đặt trường Plane Prefab:
    1. Nhấp vào nút bên cạnh None để mở cửa sổ Select GameObject (Chọn GameObject).
    2. Chọn thẻ Assets (Tài sản) rồi tìm Driving Surface Plane (Mặt phẳng bề mặt lái xe).

Prefab này trong gói khởi động cung cấp một hoạ tiết sàn thô ráp sẽ được dùng làm vật trang trí cho mặt phẳng.

  1. Thay đổi Detection Mode thành Horizontal. Điều này định cấu hình ARPlaneManager để chỉ cung cấp các mặt phẳng ngang, lý tưởng cho việc lái xe.

Thêm một thành phần ARRaycastManager

ARRaycastManager cho phép sử dụng chức năng truyền tia. Trong bước tiếp theo, chúng ta sẽ dùng đối tượng này để cung cấp các chế độ kiểm soát cho người dùng.

  1. Đảm bảo bạn đã chọn đối tượng có tên Driving Surface Manager trong ngăn Hierarchy (Hệ thống phân cấp).
  2. Trong Inspector, hãy nhấp vào Add Component (Thêm thành phần) để thêm thành phần ARRaycastManager vào đối tượng trò chơi.

Bạn không cần phải định cấu hình thêm cho thành phần này.

Thêm thành phần DrivingSurfaceManager

DrivingSurfaceManager là một tập lệnh trợ giúp trong Gói khởi động, cho phép chọn ARPlane. Sau khi bạn chọn một ARPlane, tất cả các mặt phẳng khác sẽ bị ẩn và các mặt phẳng mới sẽ bị vô hiệu hoá.

  1. Đảm bảo bạn đã chọn đối tượng có tên Driving Surface Manager trong ngăn Hierarchy (Hệ thống phân cấp).
  2. Trong Inspector, hãy nhấp vào Add Component (Thêm thành phần) để thêm thành phần DrivingSurfaceManager vào đối tượng trò chơi.

Bạn không cần phải định cấu hình thêm cho thành phần này.

Chạy ứng dụng

  1. Nhấp vào File > Build And Run... (Tệp > Tạo và chạy...) để kiểm thử các thay đổi.
  2. Hướng thiết bị vào một bề mặt ngang trong thế giới thực và di chuyển thiết bị xung quanh để cải thiện khả năng nhận biết thế giới của ARCore.

  1. Khi ARCore phát hiện một mặt phẳng, bạn sẽ thấy một hoạ tiết đất phủ lên các bề mặt trong thế giới thực. ARPlaneManager sẽ tạo thực thể cho Plane Prefab đã cho đối với mỗi mặt phẳng được phát hiện. Prefab Driving Surface Plane có một thành phần ARPlaneMeshVisualizer tạo ra một lưới cho ARPlane nhất định.

Trong bước tiếp theo, bạn sẽ dùng một mặt phẳng được phát hiện làm sân chơi.

4. Thực hiện thử nghiệm nhấn đối với các mặt phẳng được phát hiện

Trong bước trước, bạn đã lập trình một ứng dụng có thể phát hiện các mặt phẳng. Các mặt phẳng này được phản ánh trong cảnh của trò chơi. Giờ đây, bạn sẽ thêm tính năng tương tác với các mặt phẳng này bằng cách tạo một tâm ngắm và một chiếc ô tô sẽ lái trên bề mặt của mặt phẳng được phát hiện.

Tạo một tâm ngắm

Cơ chế điều khiển của ứng dụng này yêu cầu người chơi hướng điện thoại vào một bề mặt. Để đưa ra phản hồi trực quan rõ ràng cho vị trí được chỉ định, bạn sẽ sử dụng một tâm ngắm.

Để "dán" tâm ngắm này vào một mặt phẳng thực tế tăng cường, hãy sử dụng một thử nghiệm nhấn. Thử nghiệm nhấn là một kỹ thuật tính toán các giao điểm khi truyền một tia theo một hướng nhất định. Bạn sẽ dùng một thử nghiệm nhấn để phát hiện giao điểm theo hướng nhìn của camera.

Thêm tâm ngắm

  1. Trong ngăn Project (Dự án) ở gần cuối màn hình, hãy chuyển đến Assets > Starter Package (Nội dung > Gói khởi động).
  2. Đặt Reticle Prefab vào cảnh bằng cách kéo nó vào ngăn Phân cấp của dự án.
  3. Chọn tâm ngắm trong hệ phân cấp.
  4. Trong trình kiểm tra, hãy nhấp vào Add Component (Thêm thành phần). Thêm tập lệnh ReticleBehaviour từ Gói cơ bản. Tập lệnh này chứa một số mã nguyên mẫu để điều khiển tâm ngắm.
  5. Tập lệnh ReticleBehaviour phụ thuộc vào Driving Surface Manager mà bạn đã tạo trước đó, vì vậy, hãy thêm phần phụ thuộc bằng cách nhấp vào bộ chọn Driving Surface Manager. Chọn thẻ Cảnh rồi chọn Driving Surface Manager.

Chỉnh sửa ReticleBehaviour

Tập lệnh ReticleBehavior sẽ đặt tâm ngắm trên mặt phẳng ở giữa khung hiển thị của thiết bị.

  1. Mở tập lệnh ReticleBehaviour.cs bằng cách nhấp đúp vào trường Script.
  2. Xác định tâm màn hình bằng ViewToScreenPoint của Camera. Chỉnh sửa phương thức Update() để thêm nội dung sau:
var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
  1. Sử dụng điểm này để thực hiện một raycast. Thêm nội dung như sau:
var hits = new List<ARRaycastHit>();
DrivingSurfaceManager.RaycastManager.Raycast(screenCenter, hits, TrackableType.PlaneWithinBounds);

Biến hits sẽ chứa các ARRaycastHit mô tả các điểm trên đối tượng có thể theo dõi mà ray giao nhau.

  1. Xác định địa điểm yêu thích bằng cách truy vấn danh sách hits. Ưu tiên mặt phẳng bị khoá có trong DrivingSurfaceManager và nếu mặt phẳng đó không tồn tại, hãy sử dụng lượt nhấn vào mặt phẳng đầu tiên. Thêm nội dung sau vào cuối Update():
CurrentPlane = null;
ARRaycastHit? hit = null;
if (hits.Length > 0)
{
    // If you don't have a locked plane already...
    var lockedPlane = DrivingSurfaceManager.LockedPlane;
    hit = lockedPlane == null
        // ... use the first hit in `hits`.
        ? hits[0]
        // Otherwise use the locked plane, if it's there.
        : hits.SingleOrDefault(x => x.trackableId == lockedPlane.trackableId);
}
  1. Nếu hit chứa một kết quả, hãy di chuyển phép biến đổi của GameObject này đến vị trí chạm.
if (hit.HasValue)
{
    CurrentPlane = DrivingSurfaceManager.PlaneManager.GetPlane(hit.Value.trackableId);
    // Move this reticle to the location of the hit.
    transform.position = hit.Value.pose.position;
}
Child.SetActive(CurrentPlane != null);

Kiểm tra tâm ngắm

  1. Nhấp vào File > Build And Run... (Tệp > Tạo và chạy...) để kiểm thử các thay đổi.
  2. Khi hướng thiết bị vào một mặt phẳng, bạn sẽ thấy tâm ngắm di chuyển theo chuyển động của camera.

Tạo xe

Người chơi sẽ điều khiển một chiếc xe đồ chơi lái về phía vị trí của tâm ngắm. Một mô hình và hành vi cho chiếc xe này được cung cấp trong Gói khởi động.

Thêm CarManager vào cảnh

  1. Trong Hierarchy (Hệ phân cấp), hãy tạo một GameObject trống mới.
  2. Đổi tên thành Car Spawner.
  3. Chọn đối tượng bạn đã tạo. Trong ngăn Hierarchy (Hệ thống phân cấp), hãy nhấp vào Add Component (Thêm thành phần) để thêm thành phần CarManager.
  4. Thiết lập các phần phụ thuộc của CarManager bằng cách nhấp vào bộ chọn cho từng trường:
    • Car Prefab: Trong Assets (Tài sản), hãy chọn Car Prefab (Prefab ô tô).
    • Tâm ngắm: Trong Scene (Cảnh), hãy chọn Reticle Prefab (Tâm ngắm tiền chế).
    • Driving Surface Manager (Trình quản lý bề mặt lái xe): Trong Scene (Cảnh), hãy chọn Driving Surface Manager (Trình quản lý bề mặt lái xe).

Hành vi CarManager này tạo ra một chiếc xe đồ chơi trên mặt phẳng mà tâm ngắm đang ở trên. Nếu muốn, hãy xem tập lệnh CarBehaviour để tìm hiểu cách lập trình cho ô tô.

Lái thử

  1. Nhấp vào File > Build And Run (Tệp > Tạo và chạy) để kiểm thử các thay đổi.
  2. Khi nhấn vào một máy bay, bạn sẽ thấy một chiếc ô tô nhỏ xuất hiện ở vị trí đó. Chiếc xe này sẽ đi theo tâm ngắm.

Thêm phần tử trò chơi

Giờ đây, người chơi có thể điều khiển một thực thể trong cảnh, hãy cho người chơi một đích đến để lái xe đến.

  1. Tạo một GameObject trống mới trong Hierarchy (Hệ thống phân cấp).
  2. Đổi tên thành Package Spawner.
  3. Chọn đối tượng bạn đã tạo. Trong ngăn Hierarchy (Hệ thống phân cấp), hãy nhấp vào Add Component (Thêm thành phần) để thêm thành phần PackageSpawner vào đó.
  4. Thiết lập các phần phụ thuộc của PackageSpawner bằng cách nhấp vào bộ chọn cho từng trường:
    • Package Prefab: Trong Assets (Tài sản), hãy chọn Package Prefab (Gói Prefab).
    • Driving Surface Manager (Trình quản lý bề mặt lái xe) Trong Scene (Cảnh), hãy chọn Driving Surface Manager (Trình quản lý bề mặt lái xe).

Hành vi PackageSpawner này tạo ra một gói mới ở một vị trí ngẫu nhiên trên ARPlane đã khoá nếu chưa có gói nào.

Kiểm thử trò chơi

  1. Nhấp vào File > Build And Run (Tệp > Tạo và chạy) để kiểm thử các thay đổi. 2. Sau khi bạn tạo một chiếc ô tô, một gói sẽ xuất hiện.
  2. Lái xe đến nơi có gói hàng.
  3. Một quả bóng mới sẽ xuất hiện ở vị trí ngẫu nhiên.

5. Thiết lập tính năng Ước tính ánh sáng

Giờ đây, khi trò chơi cơ bản đã hoàn tất, hãy thêm một chút tính chân thực vào cảnh thực tế tăng cường của bạn. Ở bước này, bạn sẽ dùng API Ước lượng ánh sáng của ARCore để phát hiện ánh sáng trong thế giới thực dựa trên các khung hình camera đến. Thông tin này sẽ được dùng để điều chỉnh ánh sáng của cảnh cho phù hợp với ánh sáng ngoài đời thực.

Bật tính năng Ước tính ánh sáng

  1. Trong Hierarchy (Hệ thống phân cấp), hãy mở rộng AR Session Origin (Nguồn gốc của phiên thực tế tăng cường) rồi chọn đối tượng AR Camera (Camera thực tế tăng cường).
  2. Trong Inspector, hãy mở rộng tập lệnh AR Camera Manager.
  3. Thay đổi trường Ước tính ánh sáng thành Mọi thứ.

Sửa đổi đèn chiếu sáng định hướng

  1. Trong Hierarchy (Hệ thống phân cấp), hãy chọn đối tượng Directional Light (Ánh sáng định hướng).
  2. Thêm thành phần LightEstimation vào đó. Thành phần này trong Gói khởi đầu cung cấp một số mã soạn sẵn để đăng ký nhận thông báo về các thay đổi về ánh sáng.
  3. Trong hàm FrameReceived(), hãy thêm:
ARLightEstimationData lightEstimation = args.lightEstimation;

if (lightEstimation.averageBrightness.HasValue)
    Light.intensity = lightEstimation.averageBrightness.Value;

if (lightEstimation.averageColorTemperature.HasValue)
    Light.colorTemperature = lightEstimation.averageColorTemperature.Value;

if (lightEstimation.colorCorrection.HasValue)
    Light.color = lightEstimation.colorCorrection.Value;

if (lightEstimation.mainLightDirection.HasValue)
    Light.transform.rotation = Quaternion.LookRotation(lightEstimation.mainLightDirection.Value);

if (lightEstimation.mainLightColor.HasValue)
    Light.color = lightEstimation.mainLightColor.Value;

if (lightEstimation.mainLightIntensityLumens.HasValue)
    Light.intensity = lightEstimation.averageMainLightBrightness.Value;

if (lightEstimation.ambientSphericalHarmonics.HasValue)
{
    RenderSettings.ambientMode = AmbientMode.Skybox;
    RenderSettings.ambientProbe = lightEstimation.ambientSphericalHarmonics.Value;
}

Kiểm thử các thay đổi

  1. Nhấp vào File > Build And Run (Tệp > Tạo và chạy) để kiểm thử các thay đổi.
  2. Khi nhìn vào các vật thể trong cảnh, bạn có thể nhận thấy rằng chúng có màu sắc tuỳ thuộc vào ánh sáng của môi trường.
  3. Nếu có thể, hãy thử điều chỉnh ánh sáng. Ví dụ: hãy thử tắt đèn trong phòng bạn đang ở. Bạn sẽ thấy ánh sáng trên các vật thể thích ứng với sự thay đổi về ánh sáng trong thế giới thực.

6. Tóm tắt

Xin chúc mừng! Bạn đã hoàn thành lớp học lập trình này về Unity AR Foundation.

Nội dung bạn đã đề cập

  • Cách thiết lập một dự án cơ bản bằng AR Foundation và Universal Rendering Pipeline của Unity.
  • Cách sử dụng ARPlaneManager để đăng ký nhận thông tin về các máy bay mới.
  • Cách sử dụng Raycast để tìm giao điểm với hình học ảo.
  • Cách sử dụng ARLightEstimationData để chiếu sáng cảnh.

Các bước tiếp theo

Bài tập bổ sung

Nếu muốn mở rộng trò chơi mà bạn đã tạo tại đây, bạn có thể theo đuổi một số ý tưởng sau:

  • Thêm một bộ đếm điểm vào trò chơi bằng cách sửa đổi TextMeshPro khi PackageManager tạo một gói mới.
  • Hãy xem thông tin hiệu suất khi trò chơi đang chạy bằng cách bật Lớp phủ hiệu suất.
  • Trước tiên, hãy dùng Persistent Raycasts (Truy xuất tia liên tục) để đặt các đối tượng mới vào cảnh. Khi một mặt phẳng được phát hiện trong khu vực đó, đối tượng sẽ cập nhật để bám theo mặt phẳng đó.