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

Tạo trò chơi AR bằng AR Foundation của Unity

Thông tin về lớp học lập trình này

subjectLần cập nhật gần đây nhất: thg 6 25, 2021
account_circleTác giả: Dereck Bridie

1. Tổng quan

ARCore là 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ể sử dụng AR Foundation của Unity để xây dựng các ứng dụng AR trên 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ẽ 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 bằng ô 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 lý 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 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á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ặt phẳng mới.
  • Cách sử dụng Raycast để tìm các giao điểm 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ị 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

ARCore là nền tảng cung cấp trải nghiệm thực tế tăng cường trên các thiết bị Android. Nền tảng này 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 AR. 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 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 làm như vậy, hãy tham khảo tài liệu của 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, bạn sẽ thấ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). Các phiên bản Unity khác có thể hoạt động, 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ư mục, rồi 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 các 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 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 động chứa các cấu phần dựng sẵn và tập lệnh 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 > (Tài sản > Tài sả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 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, nên 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. 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 chạy.
  4. Nhấp vào Switch Platform (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 chạy các 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 mục 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 bắt buộc phải có tính năng AR 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 thành phần 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 các đối tượng AR Foundation. 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 AR: Đối tượng này kiểm soát vòng đời của một trải nghiệm AR.
  • XR > AR Session Origin (XR > Nguồn gốc phiên AR): Đối tượng này biến đổi toạ độ AR thành toạ độ thế giới 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 tính năng kết xuất

Quy trình kết xuất phổ quát 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 thành phầ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 máy ảnh 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à tính năng gỡ lỗi ADB đang bật.
  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 ứng dụng đã được cài đặt.
  3. Bạn sẽ thấy nguồn cấp dữ liệu máy ảnh trên màn hình thiết bị.

Ở 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 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ẽ các mặt phẳ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 để mở cửa sổ Select GameObject (Chọn GameObject).
    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 phần 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 để 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 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 Hệ 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 > Build And Run... (Tệp > Tạo và chạy) để kiểm thử các thay đổi.
  2. Hướng thiết bị của bạn 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 hiểu biết của ARCore về thế giới.

  1. Khi ARCore phát hiện một mặt phẳng, bạn sẽ thấy một hoạ tiết bụi bao phủ các bề mặt thực tế. ARPlaneManager tạo bản sao của 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 thử lượt nhấn trên các mặt phẳng đã phát hiện

Ở 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 tâm ngắm

Giao thức điều khiển cho ứ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 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 kiểm thử lượt nhấn để phát hiện giao lộ theo hướng của chế độ xem của máy ảnh.

Thêm đường 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 (Thành phần > Gói khởi động).
  2. Đặt Reticle Prefab vào cảnh bằng cách kéo 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 từ Gói khởi động. 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 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 cách sử dụ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 để 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 các đối tượng có thể theo dõi giao với ray.

  1. Xác định điểm giao nhau mà bạn quan tâm bằng cách truy vấn danh sách hits. Ư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 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 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 chiếc xe 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 Hệ phân cấp, hãy nhấp vào 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 (Đường ngắm): Trong Scene (Cảnh), hãy chọn Reticle Prefab (Đường ngắm tạo sẵn).
    • 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ý bề mặt lái xe).

Hành vi CarManager này tạo ra một chiếc ô tô đồ chơi trên mặt phẳng mà đường ngắm nằm trên đó. Nếu muốn, hãy xem tập lệnh CarBehaviour để tìm hiểu cách lập trình ô 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 chiếc máy bay, bạn sẽ thấy một chiếc ô tô nhỏ xuất hiện ở vị trí đó. Chiếc ô tô này sẽ đi theo mặt kẻ ô.

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 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:
    • Gói Prefab: Trong Thành phần, hãy chọn Gói Prefab.
    • 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 > 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ẽ đượ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 tính năng Ướ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 Hệ phân cấp, hãy mở rộng Nguồn gốc phiên AR rồi chọn đối tượng Máy ảnh AR.
  2. Trong Trình kiểm tra, hãy mở rộng tập lệnh Trình quản lý máy ảnh AR.
  3. Thay đổi trường Lighting Estimation (Ước tính ánh sáng) thành Everything (Mọi thứ).

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

  1. Trong Hệ phân cấp, hãy chọn đối tượng Đèn đị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ã 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 > Build And Run (Tệp > Tạo và chạy) để kiểm thử các thay đổi.
  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ụ: 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 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 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 nền tảng AR Foundation và Universal Rendering Pipeline của Unity.
  • Cách sử dụng ARPlaneManager để đăng ký các mặt phẳng 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 mà bạn đã tạo tại đây, bạn có thể tham khảo một số ý tưởng sau:

  • 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 một mặt phẳng trong khu vực đó, đối tượng đó sẽ cập nhật để chụp nhanh mặt phẳng đó.