🦧

AR 2日目 タップした位置にオブジェクトを配置するscriptファイルについて

2021/11/07に公開
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

[RequireComponent(typeof(ARRaycastManager))]
public class Spawn : MonoBehaviour
{
    [SerializeField]//1)
    GameObject objectPrefab;

    public TrackableType type;

    ARRaycastManager raycastManager;
    List<ARRaycastHit> hitResults = new List<ARRaycastHit>();

    void Start()
    {
        raycastManager = GetComponent<ARRaycastManager>();
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            if (raycastManager.Raycast(Input.GetTouch(0).position, hitResults, TrackableType.All))
            {
                Instantiate(objectPrefab, hitResults[0].pose.position, Quaternion.identity);
            }
        }
    }
}

1)SerializeFieldってなに?
参考

 [SerializeField]

変数をシリアライゼーションする。シリアライゼーションするとオブジェクトの状態をUnityが保持して、あとで再構築できる。つまり、Unity上で値をいじれるようになる。

[SerializeField] int num = 10;

こう言う書き方ならnumがUnityでいじれるようになるのだが、今回の [SerializeField]だけだと、直後の領域を知りあら罪が走れるようになる。[]で表現するものを属性という。シリアライズは上記でも述べたように、出たー構造やオブジェクトの状態を保存、再構築できるようにすることなので、[SerializeField]以下の変数をUnity上でいじれるようになってる。

  1. TrackableTypeってなに?
    どの面を検知するか。
    TrackableType.Allなら指定した面全てについて

  2. ARRaycastManager raycastManager;ってなに?
    ARRaycastManager使用しますよ、の宣言。

  3. new List<ARRaycastHit>();ってなに?
    ARRaycastHitは、レイキャストの情報を持ってる。
    レイキャストとは、ある場所から、見えない光線を発射し、検知した平面とbつかる位置があるかどうか検知するもの。例えば、スプラトゥーンで打った弾が相手に当たったかどうかなどに使用される。
    要するに、ARRaycastHit型のListなので、rayと平面がぶつかった際の情報を蓄える役割。

  4. raycastManager.Raycast(Input.GetTouch(0).position, hitResults, TrackableType.All)って?
    Raycastメソッドは、タップした画面の座標と、そこから発射されるrayと、ぶつかった平面の座標を取得し、データ構造に入れる。
    Raycast(ray発射位置, どこに保存する, 当たる面の対象)

Discussion