介紹了這麼多VR與AR的設備與開發平台,我們也想試著做出自己的VR/AR系統,由於現在的手機都已內建精良的AR感測功能,這次的實作便以架設AR系統為目標!
## 企劃發想
在AR的開發平台與程式設計篇中,我們了解了各平台的優缺點,最終鎖定在不論是Android還是ios都能架設的Unity套件---AR Foundation上,通過功能展示的示範程式,綜合我們是第一次接觸,我們決定從低難度的專案做起,目標是完成能夠掃描圖片便能自動播放影片的系統。

(圖片來源:https://youtu.be/gpaq5bAjya8?si=wmEq8Ssu1M_HzxIl 截圖)
## 軟體環境
本次使用的軟體為Unity Editor的2022.3.10f1版本(後面會提及為何不是2023),以及可以直接在Unity Hub中一起下載的OpenJDK、Android SDK相關工具及Android NDK,協助將專案輸出到手機上。

如果在創建新專案時就先選擇AR為範本,照著指示進行就會順便連AR套件一起裝好了!


## 功能設置
進到專案後就要開始建立視角與物件,AR範例在開啟時就會有預設的功能,可以把東西刪到剩下基礎視角後逐步增加需要的功能。

點擊新增後透過搜尋可以找到所有AR相關的功能,這次要做的是追蹤平面圖片,所以新增一個圖片追蹤管理員。

而要追蹤圖片需要來源,接下來就是提供追蹤用的圖片。
新增一個資料庫,並在資料庫中加入要偵測的圖片(可以提供準確的大小方便機器辨識)。
最後再拖移資料庫到管理員裡。


## 使自訂物件覆蓋追蹤圖片
目前只是做到讓機器「偵測」圖片的存在與否,我們還需要寫一個程式來讓機器知道確定圖片出現後該做什麼。
先新增一個空白元件後把程式放進該元件,就會出現可以放置自訂物件的空格。

程式的內容是使系統在感應到圖片時顯示我們定義的物件,若圖片離開鏡頭視線範圍則停止顯示,只要圖片再進入視野,就再一次重新顯示。
這個以C#撰寫的程式碼如下:
```csharp=
using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
[RequireComponent(typeof(ARTrackedImageManager))]
public class PlaceTrackedImages : MonoBehaviour {
// Reference to AR tracked image manager component
private ARTrackedImageManager _trackedImagesManager;
// List of prefabs to instantiate - these should be named the same
// as their corresponding 2D images in the reference image library
public GameObject[] ArPrefabs;
// Keep dictionary array of created prefabs
private readonly Dictionary<string, GameObject> _instantiatedPrefabs = new Dictionary<string, GameObject>();
void Awake() {
// Cache a reference to the Tracked Image Manager component
_trackedImagesManager = GetComponent<ARTrackedImageManager>();
}
void OnEnable() {
// Attach event handler when tracked images change
_trackedImagesManager.trackedImagesChanged += OnTrackedImagesChanged;
}
void OnDisable() {
// Remove event handler
_trackedImagesManager.trackedImagesChanged -= OnTrackedImagesChanged;
}
// Event Handler
private void OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs) {
// Loop through all new tracked images that have been detected
foreach (var trackedImage in eventArgs.added) {
// Get the name of the reference image
var imageName = trackedImage.referenceImage.name;
// Now loop over the array of prefabs
foreach (var curPrefab in ArPrefabs) {
// Check whether this prefab matches the tracked image name, and that
// the prefab hasn't already been created
if (string.Compare(curPrefab.name, imageName, StringComparison.OrdinalIgnoreCase) == 0
&& !_instantiatedPrefabs.ContainsKey(imageName)) {
// Instantiate the prefab, parenting it to the ARTrackedImage
var newPrefab = Instantiate(curPrefab, trackedImage.transform);
// Add the created prefab to our array
_instantiatedPrefabs[imageName] = newPrefab;
}
}
}
// For all prefabs that have been created so far, set them active or not depending
// on whether their corresponding image is currently being tracked
foreach (var trackedImage in eventArgs.updated) {
_instantiatedPrefabs[trackedImage.referenceImage.name]
.SetActive(trackedImage.trackingState == TrackingState.Tracking);
}
// If the AR subsystem has given up looking for a tracked image
foreach (var trackedImage in eventArgs.removed) {
// Destroy its prefab
Destroy(_instantiatedPrefabs[trackedImage.referenceImage.name]);
// Also remove the instance from our array
_instantiatedPrefabs.Remove(trackedImage.referenceImage.name);
// Or, simply set the prefab instance to inactive
//_instantiatedPrefabs[trackedImage.referenceImage.name].SetActive(false);
}
}
}
```
接下來就要讓把我們自己設定的東西覆蓋上去了,請看實作第二篇!
## 參考資料
- [Get Started with AR Foundation in Unity - Beginner Friendly Tutorial 2023](https://youtu.be/FWyTf3USDCQ?si=1unBObxhTgXsO69N)
- [Augmented Reality (AR) tutorial for beginners using Unity 2022](https://youtu.be/gpaq5bAjya8?si=1EFQEWZFNHZdhkee)
- [alastaira/PlaceTrackedImages.cs](https://gist.github.com/alastaira/92d790ed09330ea7a45e7c3a2a4d26e1)
- [開始使用 AR Foundation](https://developers.google.com/ar/develop/unity-arf/getting-started-ar-foundation?hl=zh-tw)
- [Create an AR game using Unity's AR Foundation](https://codelabs.developers.google.com/arcore-unity-ar-foundation#0)
- [如何建立AR世界](https://kendevlog.wordpress.com/2019/12/03/ar-world-tracking/)