Почему функция обновления не работает в UnityARHitTestExample сцены UnityARWorldMap в Unity?

#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); }