PlaneDetection スクリプトを利用し、タップをしてステージの生成を行ったら、平面感知用のゲームオブジェクトを非表示にする機能を実装します。
ARGameManager.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
public class ARGameManager : MonoBehaviour
{
[SerializeField]
private GameObject stageObj;
[SerializeField]
private CameraController cameraController;
private GameObject obj;
private ARRaycastManager raycastManager;
public enum ARState {
None, // Editor でのデバッグ用
Tracking, // 平面感知中
Preparate, // ゲーム準備前。感知終了後、Ready の前の状態
Ready, // ゲーム準備OK
Play, // ゲーム中
GameUp, // ゲーム終了
}
public ARState currentARState; // 現在の AR のステート
////* ここから変数の宣言を1つ追加 *////
private PlaneDetection planeDetection;
////* ここまで *////
void Awake() {
TryGetComponent(out raycastManager);
# if UNITY_EDITOR
// ステート管理処理を追加
currentARState = ARState.None;
# elif UNITY_ANDROID || UNITY_IOS
// ステート管理処理を追加
currentARState = ARState.Tracking;
# endif
}
void Update()
{
// AR でない場合には処理を行わない
if (currentARState == ARState.None) {
return;
}
// 画面のタップしていない場合
if (Input.touchCount < 0) {
// 何も処理を行わない
return;
}
if (currentARState == ARState.Tracking) {
平面感知
TrackingPlane();
} else if (currentARState == ARState.Preparate) {
currentARState = ARState.Ready;
LogDebugger.instance.DisplayLog(currentARState.ToString());
// ゲーム開始の準備
StartCoroutine(PraparateGameReady());
} else if (currentARState == ARState.Play) {
// ゲームプレイ中のデバッグ表示
LogDebugger.instance.DisplayLog(currentARState.ToString());
}
}
/// <summary>
/// 平面感知と field 表示
/// </summary>
private void TrackingPlane() {
// タップした情報を変数に格納
Touch touch = Input.GetTouch(0);
// Ray の情報を格納するための変数の宣言
List<ARRaycastHit> raycastHitList = new List<ARRaycastHit>();
// AR Camera からタップした地点に向かって Ray を発射し、平面感知している部分に Ray が侵入したか判定
if (raycastManager.Raycast(touch.position, raycastHitList, TrackableType.PlaneWithinPolygon)) {
// Ray が平面感知した最新の地点を取得
Pose hitPose = raycastHitList[0].pose;
if (obj == null) {
LogDebugger.instance.DisplayLog("Raycast 成功");
// ステージを生成
obj = Instantiate(stageObj, hitPose.position, hitPose.rotation);
////* ここから TODO を実装 *////
// 平面感知を終了
if (TryGetComponent(out planeDetection)) {
planeDetection.SetAllPlaneActivate(false);
LogDebugger.instance.DisplayLog("平面感知を終了");
}
////* ここまで *////
// TODO ペンギンの情報をカメラにセット
// AR の状態を感知中の状態からゲーム準備前の状態に変える
currentARState = ARState.Preparate;
} else {
LogDebugger.instance.DisplayLog("Raycast 済");
obj.transform.position = hitPose.position;
}
} else {
LogDebugger.instance.DisplayLog("RayCast 失敗");
}
}
/// <summary>
/// ゲーム開始の準備
/// </summary>
private IEnumerator PraparateGameReady() {
// TODO 準備処理を書く
yield return new WaitForSeconds(2.0f);
currentARState = ARState.Play;
LogDebugger.instance.DisplayLog(currentARState.ToString());
// TODO ゲームの開始処理を書く
}
}