[AR Foundation] AR Foundation学习之路(持续记录)

1.利用手机USB调试,打包安卓项目

值得注意的是:

  • 手机 开发者模式打开
  • 手机 USB调试打开
  • 连接时为 传送文件

2.2021版本unity 打包设置示意图:

在这里插入图片描述

3.Unity事件函数

Reset()函数:

调用时间:当脚本第一次挂载到物体对象上时或者就是在我们的物体的Inspector面板中,对脚本test进行Reset时也会触发。

作用:来初始化脚本的各个属性,Reset最常用于在检测面板中提供良好的默认值。

Awake():

调用时间:

a.在加载场景资源时,初始化包含脚本的激活状态下的GameObject

b.GameObject从非激活状态转变为激活状态

c.在初始化使用Instantiate创建的GameObject之后

每个游戏物体上的Awke以随机的顺序被调用。

Awake总是在Start之前被调用。

Awake像构造函数一样只被调用一次

OnEnable()

当对象变为可用或该组件被激活时此函数被调用。

4.锚点的使用

在这里插入图片描述
射线以及锚点添加的实践

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;

public class ARPlaneHologram : MonoBehaviour
{
    
    
    // The Prefab to instantiate on touch
    [SerializeField]
    private GameObject _prefabtoPlace;

    //Cache ARRaycastMananager GameObject from ARCoreSession
    private ARRaycastManager _aRRaycastManager;

    //List for raycast hits is re-used by raycast manager
    private static readonly List<ARRaycastHit> hits = new List<ARRaycastHit>();


    //Cache ARAnchorMananager GameObject from ARCoreSession
    private ARAnchorManager _aRAnchorManager;

    //Cache ARPlaneMananager GameObject from ARCoreSession
    private ARPlaneManager _aRPlaneManager;
    private void Awake()
    {
    
    
        _aRRaycastManager = GetComponent<ARRaycastManager>();
        _aRAnchorManager = GetComponent<ARAnchorManager>();
    }
    private void Update()
    {
    
    
        // Only consider single-finger touches that are beginning 
        //Touch touch;
        if (Input.touchCount < 1 || Input.GetTouch(0).phase != TouchPhase.Began) return;

        //Perform AR raycast to any kind of trackable
        if (_aRRaycastManager.Raycast(Input.GetTouch(0).position ,hits, TrackableType.AllTypes))
        {
    
    
            // Raycast hits are sorted by distance, so the first one will be the closest hit
            var hitpose = hits[0].pose;

            //Instantiate the prefab at the given position 
            //Instantiate(_prefabtoPlace, hitpose.position, hitpose.rotation);
            ARAnchor anchor;  
            anchor = CreateAnchor(hits[0]);
        }
    }

    ARAnchor CreateAnchor(in ARRaycastHit hit)
    {
    
    
        ARAnchor anchor;
        
        //if we hit a plane, try to "attach" the anchor to the plane
        if (hit.trackable is ARPlane plane)
        {
    
    
            var planeManager = GetComponent<ARPlaneManager>();

            if (planeManager)
            {
    
    
                //get original prefab of ARAnchorManager
                var oldprefab = _aRAnchorManager.anchorPrefab;

                //replace into the prefab of this Script Component
                //Also,Any prefab is ok if you want
                _aRAnchorManager.anchorPrefab = _prefabtoPlace;

                //将锚点锚定到平面,当前hit.pose创建锚点
                anchor = _aRAnchorManager.AttachAnchor(plane, hit.pose);

                //Restore original prefab

                _aRAnchorManager.anchorPrefab = oldprefab;
                return anchor;
            }
        }
        var instantiateObject = Instantiate(_prefabtoPlace, hit.pose.position, hit.pose.rotation);

        //make sure the new GameObject has an ARanchor component
        anchor = instantiateObject.GetComponent<ARAnchor>();

        if (anchor == null)
        {
    
    
            anchor = instantiateObject.AddComponent<ARAnchor>();
        }
        return anchor;
    }

}

输出信息到UI端

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;

using UnityEngine.XR.ARFoundation;

public class PointCloudInfo : MonoBehaviour
{
    
    
    //
    private ARPointCloud _aRPointCloud;


    //Reference to logging UI element in the canvas
    public TMP_Text Log;
    private void OnEnable()
    {
    
    
        //Subscribe to the event when point cloud changed 
        _aRPointCloud = GetComponent<ARPointCloud>();
        _aRPointCloud.updated += OnPointedChanged;
    }
    private void OnDisable()
    {
    
    
        //Unsubscribe event when this element is disabled
        _aRPointCloud.updated -= OnPointedChanged;
    }

    private void OnPointedChanged(ARPointCloudUpdatedEventArgs obj)
    {
    
    
        if (!_aRPointCloud.positions.HasValue || !_aRPointCloud.identifiers.HasValue || !_aRPointCloud.confidenceValues.HasValue) return;
        var _positions = _aRPointCloud.positions.Value;
        var _identifiers = _aRPointCloud.identifiers.Value;
        var _confidence = _aRPointCloud.confidenceValues.Value;
        if (_positions.Length == 0) return;
        var logText = "Number of points: " + _positions.Length + "\nPoint info: x = "
                  + _positions[0].x + ", y = " + _positions[0].y + ", z = " + _positions[0].z
                  + ",\n Identifier = " + _identifiers[0] + ", Confidence = " + _confidence[0];
        if (Log)
        {
    
    
            
            Log.text = logText;
        }
        else
        {
    
    
            Debug.Log(logText);
        }
    }
}

5.一个比较全面的入门教学

涉及到平面检测/点云/锚点/事件等知识

猜你喜欢

转载自blog.csdn.net/qq_51533157/article/details/126314937