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à bộ khung của Google để xây dựng 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 đa 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ẽ xây dựng 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 cách sử dụng một chiếc xe mà bạn điều khiển bằng thiết bị cầm tay của mình.

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 lý và bit kỹ thuật số để tạo ra một kiểu trải nghiệm mới cho người chơi bằng cách tạo ra một trò chơi hiểu rõ 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áy bay trong thế giới thực và vẽ một sân chơi trên đó.
  • Truyền các tia từ góc nhìn của máy ảnh và phát hiện các điểm giao cắt với các mặt phẳng.
  • Hãy phản ứng với điều kiện ánh sáng thực tế để giúp trò chơi của bạn trở nên chân thực hơn.

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

  • Cách thiết lập dự án sử dụng AR Foundation của Unity.
  • Cách sử dụng ARPlaneManager để đăng ký các máy bay mới.
  • Cách sử dụng Raycast để tìm giao lộ có 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ị sẵn sàng cho môi trường để phát triển bằng nền tảng AR Foundation của Unity.

Đảm bảo thiết bị của bạn tương thích với công nghệ thực tế tăng cường

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

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

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

Cài đặt Unity (LTS 2020.3)

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 giao diện người dùng của Unity trong phiên bản 2020.3 (LTS) sẽ xuất hiện. Các phiên bản Unity khác có thể hoạt động hiệu quả, nhưng có thể cần thêm một số bước. Biểu tượng này có thể khác với ảnh chụp màn hình hiển thị ở đâ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 phổ quát). Đặt tên mô tả và vị trí thích hợp cho thẻ đó, sau đó nhấn vào TẠO.

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

Bạn có thể tìm thấy AR Foundation của Unity trong Trình quản lý gói của Unity.

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

  1. Trong cửa sổ này, hãy cài đặt các gói bạn 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 những khung này bằng cách mở rộng mục nhập thông qua biểu tượng . Cài đặt phiên bản mới nhất cho từng khung sau:
    • Nền tảng AR
    • Trình bổ trợ ARCore XR

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

Cài đặt gói khởi đầu

Đối với 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 prefab và các tập lệnh sẽ 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 đầu bằng cách mở Assets > (Thành phần >) Nhập gói > Custom Package... (Gói tuỳ chỉnh) và mở starter-package.unitypackage.
  2. Trong cửa sổ bật lên, hãy đảm bảo mọi thứ đều đã được chọn.
  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ở Tệp > Build Settings (Cài đặt bản dựng).
  2. Trong ngăn Platform (Nền tảng), hãy chọn Android.
  3. (Không bắt buộc) 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 chạy.
  4. Nhấp vào Switch Platform (Chuyển nền tảng).

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

Bạn cần định cấu hình nền tảng AR để khởi chạy hệ thống XR khi khởi động.

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

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

  1. Các ứng dụng yêu cầu đối với thực tế tăng cường sử dụng ARCore yêu cầu cấp độ API tối thiểu là 24. Di chuyển xuống rồi tìm Minimum API Level (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ử cảnh bắt buộc

Mẫu Universal Render Pipeline đ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á mọi đối tượng trò chơi trong SampleScene.

  1. Thêm đối tượng Nền tảng thực tế tăng cường (AR). Nhấp chuột phải vào ngăn Hệ phân cấp. Sử dụng trình đơn này để thêm:
  • XR > Phiên thực tế tăng cường: Đố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 > Nguồn gốc phiên thực tế tăng cường: Đối tượng này biến các toạ độ AR thành toạ độ thế giới của Unity.
  • Sáng > Ánh sáng định hướng: Đây là 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 Nguồn gốc phiên thực tế tăng cường mà bạn đã tạo trong hệ phân cấp rồi chọn đối tượng Máy ảnh thực tế tăng cường. Trong trình kiểm tra, hãy thay đổi thẻ thành MainCamera.

Thiết lập quá 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 qua phần Assets > 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 trình kết xuất đồ hoạ) để thêm Tính năng trình kết xuất trong nền AR. Thành phần này sẽ kết xuất nguồn cấp dữ liệu camera trong cảnh của bạn.

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

  1. Hãy đảm bảo bạn đã cắm thiết bị và bật tính năng gỡ lỗi ADB.
  2. Nhấp vào File > (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 cài đặt.
  3. Bạn sẽ thấy nguồn cấp dữ liệu camera trên màn hình của 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 của mình.

3. Phát hiện máy bay trong thế giới thực

Giờ đây, một cảnh cơ bản đã được thiết lập, bạn có thể bắt đầu phát triển trò chơi. Ở 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 và xoá các đối tượng trò chơi khi thiết bị hiểu biết về môi trường thay đổi.

  1. Bằng cách sử dụng ngăn Phân cấp, hãy 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ặt phẳng cho đến khi người chơi chọn một mặt phẳng.
  3. Chọn đối tượng trò chơi mới. Trong ngăn Inspector (Trình kiểm tra), 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 để hiển thị cửa sổ Chọn IntelliJ.
    2. Chọn thẻ Thành phần rồi tìm mục Drive Surface Plane (Lái xe trên mặt đất).

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

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

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

ARRaycastManager cho thấy chức năng raycast. Trong bước tiếp theo, chúng ta sẽ sử dụng đối tượng này để cung cấp các chế độ điều khiển cho người dùng.

  1. Đảm bảo đối tượng có tên là Driving Surface Manager được chọn trong ngăn Phân cấp.
  2. Trong Trình kiểm tra, 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 định cấu hình thêm cho thành phần này.

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

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

  1. Đảm bảo đối tượng có tên là Driving Surface Manager được chọn trong ngăn Phân cấp.
  2. Trong Trình kiểm tra, 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 đị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 > (Tệp >) Tạo và chạy... để kiểm thử các thay đổi của bạn.
  2. Hướng thiết bị của bạn vào bề mặt nằm ngang trong thế giới thực và di chuyển thiết bị xung quanh để cải thiện hiểu biết của ARCore về thế giới.

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

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

4. Thực hiện kiểm tra va chạm trên các máy bay đã 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 máy bay. Những mặt phẳng này được phản ánh trong cảnh trò chơi của bạn. Giờ đây, bạn sẽ thêm khả năng tương tác với những máy bay này bằng cách chế tạo một lưới ngắm và một chiếc ô tô có thể lái trên bề mặt của máy bay được phát hiện.

Tạo lưới ngắm

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

Để "gắn kết" mặt kẻ ô này trên mặt phẳng AR, hãy dùng phép thử va chạm. Kiểm tra va đập là một kỹ thuật tính toán các giao điểm khi truyền tia theo một hướng nhất định. Bạn sẽ sử dụng thử nghiệm nhấn để phát hiện giao lộ theo hướng nhìn của máy ảnh.

Thêm ô

  1. Trong ngăn Project (Dự án) ở gần cuối màn hình, hãy chuyển đến Assets (Thành phần) > Gói dành cho người mới sử dụng.
  2. Đặt Reticle Prefab vào cảnh bằng cách kéo thành phần này vào Ngăn phân cấp của dự án.
  3. Chọn ô kẻ ô 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 qua Gói khởi đầu. Tập lệnh này chứa một số mã nguyên mẫu để kiểm soát reticle.
  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 trình chọn Driving Surface Manager. Chọn thẻ Scene (Cảnh) rồi chọn Driving Surface Manager.

Chỉnh sửa ReticleBehaviour

Tập lệnh ReticleBehavior sẽ định vị mặt kẻ ô trên mặt phẳng ở chính giữa khung nhìn 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 máy ảnh. 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 để tiến hành truyền tia. 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 các đối tượng có thể theo dõi giao với ray.

  1. Xác định giao điểm yêu thích bằng cách truy vấn danh sách hits. Hãy ưu tiên máy bay bị khoá có trong DrivingSurfaceManager và nếu máy bay không tồn tại, hãy sử dụng lượt đánh máy bay đầu tiên. Thêm đoạn mã 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 có chứa kết quả, hãy di chuyển biến đổi của GameObject này sang vị trí lượt truy cập.
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 mặt kẻ ô

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

Tạo ô tô

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

Thêm CarManager vào cảnh của bạn

  1. Trong 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ệ 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 trình chọn cho mỗi trường:
    • Car Prefab: Trong phần Assets (Thành phần), hãy chọn Car Prefab.
    • Reticle (Màn hình): Trong Scene, hãy chọn Reticle Prefab.
    • Trình quản lý nền tảng lái xe: Trong Scene (Cảnh), hãy chọn Driving Surface Manager (Trình quản lý nền tảng lái xe).

Hành vi CarManager này sẽ tạo ra một chiếc xe đồ chơi trên máy bay có mặt kẻ ô. Nếu muốn, hãy xem tập lệnh CarBehaviour để tìm hiểu cách lập trình xe ô tô.

Lái thử

  1. Nhấp vào File > (Tệp >) Tạo và chạy để kiểm thử các thay đổi của bạn.
  2. Khi bạn nhấn vào máy bay, bạn sẽ thấy một chiếc ô tô nhỏ xuất hiện tại vị trí đó. Chiếc ô tô này sẽ đi theo mặt kẻ ô.

Thêm thành phần trong trò chơi

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

  1. Tạo một GameObject trống mới trong Hệ 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ệ 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 trình chọn cho mỗi trường:
    • Package Prefab (Gói hàng): Trong phần Assets (Tài sản), hãy chọn Package Prefab (Gói hàng trước).
    • Trình quản lý nền tảng lái xe Trong Scene (Cảnh), hãy chọn drive Surface Manager (Trình quản lý nền tảng lái xe).

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

Kiểm thử trò chơi

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

5. Thiết lập ước tính ánh sáng

Giờ đây, trò chơi cơ bản đã được hoàn tất, hãy thêm một chút chất lượng chân thực vào cảnh thực tế tăng cường của bạn. Trong bước này, bạn sẽ sử dụng API Ước tính á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 máy ảnh chuyển đế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 thực tế.

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

  1. Trong mục Phân cấp, hãy mở rộng Nguồn gốc phiên thực tế tăng cường rồi chọn đối tượng Máy ảnh thực tế tăng cường.
  2. Trong Inspector (Trình kiểm tra), hãy mở rộng tập lệnh AR Camera Manager (Trình quản lý camera thực tế tăng cường).
  3. Thay đổi trường Dự kiến ánh sáng thành Mọi thứ.

Sửa đổi đèn định hướng

  1. Trong mục Hệ phân cấp, hãy chọn đối tượng Ánh sáng 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ã nguyên mẫu để đăng ký 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 > (Tệp >) Tạo và chạy để kiểm thử các thay đổi của bạn.
  2. Khi quan sát các vật thể trong cảnh, bạn có thể nhận thấy các vật thể đó 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ụ: 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 thực tế.

6. Tóm tắt

Xin chúc mừng! Bạn đã đến phần cuối của lớp học lập trình này trên Unity AR Foundation.

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

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

Các bước tiếp theo

Bài tập tặng thêm

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

  • Thêm bộ đếm điểm vào trò chơi của bạn bằng cách sửa đổi TextMeshPro khi PackageManager tạo gói mới.
  • Kiểm tra thông tin về hiệu suất khi trò chơi của bạn đang chạy bằng cách bật Lớp phủ hiệu suất.
  • Sử dụng Persistent Raycast để đưa đối tượng mới vào cảnh trước tiên. Khi phát hiện thấy một máy bay trong khu vực đó, vật thể đó sẽ cập nhật để bám vào mặt phẳng đó.