Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) — Часть 2

Список устройств, нативно поддерживающих ARCore, находится на сайте Google Developers.

Часть 2

0. Первая часть урока описана в другой заметке.
1. Создаём пустой объект:
GameObjectCreateEmpty
2. Сбрасываем его координаты на ноль:
TransformReset
3. Переименовываем его на «Game Piece»
4. Перетаскиваем объект Cube на наш новый объект, таким образом мы сделаем Куб его дочерним объектом.
5. Меняем его координаты по Y на 0.5.
5. Перетаскиваем «Game Piece» в папку Prefabs, чтобы сделать его префабом.
6. Удаляем его со сцены
7. Создаём пустой объект, переименовываем его на Placement Indicator.
8. Сбрасываем его координаты на ноль.
9. Для него создаём дочерний объект:
GameObject3D ObjectQuad
10. Разворачиваем его параллельно полу:
TransformRotationX = 90
11. Уменьшаем масштаб по всем осям, чтобы он соответствовал размеру куба:
TransformScale ▶ Все значения 0.1
12. Импортируем текстуру для этого проекта:
AssetsImport New Asset:
Assets\ARFoundation Demo Assets\AR Placement Indicator.png
13. В Инспекторе, в настройках Импорта, необходимо отметить галочкой пункт «Alpha Is Transparency» и нажать кнопку «Apply»:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
14. Следующим шагом мы создаём материал:
ProjectAssetsMaterialsCreateMaterial
PlacementIndicator
15. Меняем его шейдер на Unlit/Transparent
16. Выбираем для него нашу текстуру из п.13:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
17. Перетаскиваем вновь созданный материал на плоскость из п.9.
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
18. Теперь в окне Project создадим скрипт «ARTapToPlaceObject.cs», который будет управлять логикой в нашей сцене:
CreateC# Script
19. Откроем его для редактирования (двойной щелчок мышкой на файле)
20. Импортируем в файл пару библиотек, для чего допишем в начало файла такие строчки:

using UnityEngine.XR.ARFoundation;
using UnityEngine.Experimental.XR;

21. Файл ARTapToPlaceObject.cs я немного изменил:

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

public class ARTapToPlaceObject : MonoBehaviour
{
  public GameObject objectToPlace;
  public GameObject placementIndicator;
  // Data structure that discribes the position and rotation of the 3D point
  private Pose placementPose;
  private bool placementPoseIsValid = true;
  private ARRaycastManager raycastManager;
  
  // Start is called before the first frame update
  void Start()
  {
    //arOrigin = FindObjectOfType<ARSessionOrigin>();
    raycastManager = FindObjectOfType<ARRaycastManager>();
  }


  // Update is called once per frame
  void Update()
  {
    UpdatePlacemantPose();
    UpdatePlacemantIndicator();

    // If user finger is on the screen and touch is just began, we can place the object
    if(placementPoseIsValid && Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began)
    {
      PlaceObject();
      
    }
  }

  private void PlaceObject()
  {
    Instantiate(objectToPlace, placementPose.position, placementPose.rotation);
  }

  private void UpdatePlacemantIndicator()
  {
    if (placementPoseIsValid) // Show indicator
    {
      placementIndicator.SetActive(true);
      placementIndicator.transform.SetPositionAndRotation(placementPose.position, placementPose.rotation);
    }
    else // Hide indicator
    {
      placementIndicator.SetActive(false); 
    }
  }

  private void UpdatePlacemantPose()
  {
//    var screenCenter = Camera.current.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
    var screenCenter = Camera.main.ViewportToScreenPoint(new Vector3(0.5f, 0.5f));
    var hits = new List<ARRaycastHit>();

    raycastManager.Raycast(screenCenter, hits, TrackableType.Planes); 

    placementPoseIsValid = hits.Count > 0;
    if (placementPoseIsValid)
    {
      placementPose = hits[0].pose;
      var cameraForward = Camera.main.transform.forward;
      var cameraBearing = new Vector3(cameraForward.x, 0, cameraForward.z).normalized;
      placementPose.rotation = Quaternion.LookRotation(cameraBearing);
    }
  }
}

Использование объекта ARSessionOrigin являлось ключом, позволяющем нам взаимодействовать с окружающим миром. Однако это имело отношение к экспериментальным библиотекам. В последних версиях для взаимодействия будем использовать ARRaycastManager.

22. Возвращаемся в редактор Unity и создаём пустой объект, назовём его Interaction
23. Перетащим на него наш скрипт из п.21.
24. Перетащим в поле «placementIndicator» соответствующий объект со сцены:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
25. Теперь можно собрать и запустить этот проект:
FileBuild and Run Ctrl+B

25. Импортируем в проект модельку самолётика.
26. Изменить настройки качества графики:
Project SettingsQualityMedium
Shadow Distance = 8
Shadow Resolution = High Resolution
27. Изменим масштаб сессии AR (чтобы не уменьшать масштаб модельки самолёта):

  • Переходим в окно Иерархии
  • Выбираем AR Session Origin
  • Меняем его масштаб на 10.

Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
28. Не забудьте также увеличить масштаб Placement Indicator:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
29. Удаляем самолётик со сцены
30. В поле ОbjectToPlace перетащим префаб самолётика:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2
31. Теперь если запустить проект и тапнуть на экран смартфона, на месте индикатора появится самолётик:
Unity: Урок Getting Started With ARFoundation in Unity (ARKit, ARCore) - Часть 2



Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments