Список устройств, нативно поддерживающих ARCore, находится на сайте Google Developers.
Часть 2
0. Первая часть урока описана в другой заметке.
1. Создаём пустой объект:
▶
2. Сбрасываем его координаты на ноль:
▶
3. Переименовываем его на «Game Piece»
4. Перетаскиваем объект Cube на наш новый объект, таким образом мы сделаем Куб его дочерним объектом.
5. Меняем его координаты по Y на 0.5.
5. Перетаскиваем «Game Piece» в папку Prefabs, чтобы сделать его префабом.
6. Удаляем его со сцены
7. Создаём пустой объект, переименовываем его на Placement Indicator.
8. Сбрасываем его координаты на ноль.
9. Для него создаём дочерний объект:
▶ ▶
10. Разворачиваем его параллельно полу:
▶ ▶ X = 90
11. Уменьшаем масштаб по всем осям, чтобы он соответствовал размеру куба:
▶ ▶ Все значения 0.1
12. Импортируем текстуру для этого проекта:
▶ :
Assets\ARFoundation Demo Assets\AR Placement Indicator.png
13. В Инспекторе, в настройках Импорта, необходимо отметить галочкой пункт «Alpha Is Transparency» и нажать кнопку «Apply»:
14. Следующим шагом мы создаём материал:
▶ ▶ ▶ ▶
PlacementIndicator
15. Меняем его шейдер на Unlit/Transparent
16. Выбираем для него нашу текстуру из п.13:
17. Перетаскиваем вновь созданный материал на плоскость из п.9.
18. Теперь в окне Project создадим скрипт «ARTapToPlaceObject.cs», который будет управлять логикой в нашей сцене:
▶
19. Откроем его для редактирования (двойной щелчок мышкой на файле)
20. Импортируем в файл пару библиотек, для чего допишем в начало файла такие строчки:
using UnityEngine.XR.ARFoundation;
using UnityEngine.Experimental.XR;
21. Файл 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» соответствующий объект со сцены:
25. Теперь можно собрать и запустить этот проект:
▶
25. Импортируем в проект модельку самолётика.
26. Изменить настройки качества графики:
▶ ▶
Shadow Distance = 8
Shadow Resolution = High Resolution
27. Изменим масштаб сессии AR (чтобы не уменьшать масштаб модельки самолёта):
- Переходим в окно Иерархии
- Выбираем AR Session Origin
- Меняем его масштаб на 10.
28. Не забудьте также увеличить масштаб Placement Indicator:
29. Удаляем самолётик со сцены
30. В поле ОbjectToPlace перетащим префаб самолётика:
31. Теперь если запустить проект и тапнуть на экран смартфона, на месте индикатора появится самолётик:
- C#: Сравнить два массива - 12.12.2024
- EVE-Online: Фильтры каналов - 23.11.2024
- Не приходит СМС для авторизации на сайте Госуслуги - 01.11.2024