¡¡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 ¤Î¥¹¥Æ¡¼¥È
////* ¤³¤³¤«¤éÊÑ¿ô¤ÎÀë¸À¤ò£±¤ÄÄɲà *////
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 ¥²¡¼¥à¤Î³«»Ï½èÍý¤ò½ñ¤¯
}
}
¥³¥á¥ó¥È¤ò¤«¤¯