#ios #unity3d #augmented-reality #arkit
#iOS #unity3d #дополненная реальность #arkit
Вопрос:
Я работаю над UnityARWorldMap, чтобы создать постоянство в unity.Итак, я размещаю модели в реальном мире, сохраняю их и позже загружаю.Когда я нажимаю Load() в ,, Manager.cs функция обновления в UnityARhitTestExample перестает обновляться.Ниже приведен скрипт для управления.
public void Save()
{
//Saving the data into Application.persistentDataPath
}
public void Load()
{
//Loads the data from Application.persistentDataPath
Debug.LogFormat("Loading ARWorldMap {0}", path);
var worldMap = ARWorldMap.Load(path);
if (worldMap != null)
{
m_LoadedMap = worldMap;
Debug.LogFormat("Map loaded. Center: {0} Extent: {1}", worldMap.center, worldMap.extent);
UnityARSessionNativeInterface.ARSessionShouldAttemptRelocalization = true;
var config = m_ARCameraManager.sessionConfiguration;
config.worldMap = worldMap;
UnityARSessionRunOption runOption = UnityARSessionRunOption.ARSessionRunOptionRemoveExistingAnchors | UnityARSessionRunOption.ARSessionRunOptionResetTracking;
Debug.Log("Restarting session with worldMap");
session.RunWithConfigAndOptions(config, runOption);
}
}
В функции обновления UnityARHitTestExample.cs я предоставил инструкцию для печати.Он прекращает печать, когда я нажимаю кнопку загрузки.Почему это?
public class UnityARHitTestExample : MonoBehaviour
{
public static UnityARHitTestExample HittestInstance;
public GameObject[] Allmodels;
public Transform m_HitTransform;
public float maxRayDistance = 30.0f;
public LayerMask collisionLayer = 1 << 10; //ARKitPlane layer
bool placed = false;
public List<DataHandlers> Modelinfo = new List<DataHandlers>();
List<GameObject> ContainerObject = new List<GameObject>();
GameObject currentModel;
string json;
int indexchoice;
GameObject temp;
List<int> indexarray = new List<int>() ;
float rotateValue = 300f;
//Original Camera Parent position
public Transform CameraParent;
private Vector3 Campos;
public Text Positions;
bool HitTestWithResultType (ARPoint point, ARHitTestResultType resultTypes)
{
List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface ().HitTest (point, resultTypes);
if (hitResults.Count > 0 ) {
foreach (var hitResult in hitResults) {
if (currentModel != null)
{
Debug.Log("Got hit!");
temp = Instantiate(currentModel);
ContainerObject.Add(temp);
placed = true;
temp.transform.position=UnityARMatrixOps.GetPosition(hitResult.worldTransform);
temp.transform.rotation=UnityARMatrixOps.GetRotation(hitResult.worldTransform);
Debug.Log(string.Format("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));
return true;
}
}
}
return false;
}
private void Start()
{
HittestInstance = this;
}
private void LateUpdate()
{
Camera.main.transform.SetParent(CameraParent.transform);
}
private void Update()
{
Debug.Log("Changed ");
#if UNITY_EDITOR //we will only use this script on the editor side, though there is nothing that would prevent it from working on device
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
//we'll try to hit one of the plane collider gameobjects that were generated by the plugin
//effectively similar to calling HitTest with ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent
if (Physics.Raycast(ray, out hit, maxRayDistance, collisionLayer))
{
//we're going to get the position from the contact point
m_HitTransform.position = hit.point;
Debug.Log(string.Format("x:{0:0.######} y:{1:0.######} z:{2:0.######}", m_HitTransform.position.x, m_HitTransform.position.y, m_HitTransform.position.z));
//and the rotation from the transform of the plane collider
m_HitTransform.rotation = hit.transform.rotation;
}
}
#else
if (Input.touchCount == 1 amp;amp; m_HitTransform != null amp;amp; !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId) )
{
var touch = Input.GetTouch(0);
//if (touch.phase == TouchPhase.Began || touch.phase == TouchPhase.Moved)
if (touch.phase == TouchPhase.Began amp;amp; isLocked==false )
{
var screenPosition = Camera.main.ScreenToViewportPoint(touch.position);
ARPoint point = new ARPoint {
x = screenPosition.x,
y = screenPosition.y
};
//User Initial choice was for existing plane amp; Horizontal plane
// prioritize reults types
ARHitTestResultType[] resultTypes = {
ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingGeometry,
//ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent,
// if you want to use infinite planes use this:
// ARHitTestResultType.ARHitTestResultTypeExistingPlane,
// ARHitTestResultType.ARHitTestResultTypeEstimatedHorizontalPlane,
//ARHitTestResultType.ARHitTestResultTypeEstimatedVerticalPlane,
//ARHitTestResultType.ARHitTestResultTypeFeaturePoint
};
foreach (ARHitTestResultType resultType in resultTypes)
{
if (HitTestWithResultType (point, resultType))
{
return;
}
}
}
}
#endif
}
Комментарии:
1. К какому объекту
UnityARHitTestExample
прикреплен, может быть, онm_LoadedMap = worldMap;
переопределяет объект, который содержитUnityARHitTestExample
? Это также останавливает запускLateUpdate
или только обновление? Если ни один из них не проверяет, активен ли скрипт все еще в сцене.2. Я попробовал Update (), обновил все с опозданием. Я думаю, что скрипт UnityArhitTestExample больше не работает. Скрипт UnityARHitTestExample прикреплен к объекту Hitcubeparent Gameobject, а в Hierarchymanager.cs прикреплен к Gameobject в hierarchymanager в иерархии
3. @remy_rm Это потому, что происходит сброс отслеживания?
4. насколько мне известно
Update
цикл останавливается только в том случае, если скрипт не активен. (например, компонент скрипта отключен, скрипта нет в сцене или отключен GameObject, на котором он находится)5. @remy_rm Я прокомментировал эту нижеприведенную часть скрипта в WorldMap WorldMapmanager, и мое обновление работало…. цикл if внутри LOAD() .. if (Карта мира != null) { m_LoadedMap = Карта мира;…………………… ………………………………………………………………………………………………………………..session. RunWithConfigAndOptions(конфигурация, runOption); }