Приложение внезапно закрылось после обнаружения привязки

Недавно я разрабатываю Azure Spatial Anchor в Hololens. После изучения этого руководства с веб-сайта Microsoft здесь я немного подправил свой код. До сих пор это работало хорошо. Пока я не попытаюсь найти якорь, который я создал. После того, как мой якорь найден (и создан экземпляр найденного якоря), мои приложения внезапно закрылись. Он доходит до той части, где отображается текст «Найдено!». Вот часть моего кода, которая находит якорь.

    void Update(){
        lock (dispatchQueue)
        {
            if (dispatchQueue.Count > 0)
            {
                dispatchQueue.Dequeue()();
            }
        }

    }

    protected void QueueOnUpdate(Action updateAction)
    {
        lock (dispatchQueue)
        {
            dispatchQueue.Enqueue(updateAction);
        }
    }


    private void CloudSpatialAnchorSession_AnchorLocated(object sender, AnchorLocatedEventArgs args){
        switch (args.Status){
            case LocateAnchorStatus.Located:
                QueueOnUpdate(() =>{
                    var cube = GameObject.Instantiate(cubePrefab) as GameObject;
                    cube.transform.localScale = new Vector3(0.1f, 0.1f, 0.1f);
                    cube.AddComponent<WorldAnchor>();
                    cube.GetComponent<UnityEngine.XR.WSA.WorldAnchor>().SetNativeSpatialAnchorPtr(args.Anchor.LocalAnchor);
                    cubeMaterial = cube.GetComponent<Renderer>().material;
                    cubeMaterial.color = Color.red;

                    this.cubes.Add(cube);
                    cloudAnchorId = "";
                    this.msg.text = "Found!";
                    Task.Run(async () =>{
                        await Task.Delay(1000);
                    });
                });
                break;
            case LocateAnchorStatus.AlreadyTracked:
                this.msg.text = "ASA Info: Anchor already tracked. Identifier: " + args.Identifier;
                break;
            case LocateAnchorStatus.NotLocated:
                this.msg.text = "ASA Info: Anchor not located. Identifier: " + args.Identifier;
                break;
            case LocateAnchorStatus.NotLocatedAnchorDoesNotExist:
                this.msg.text = "ASA Error: Anchor not located does not exist. Identifier: " + args.Identifier;
                break;
        }
    }
    private void CloudSpatialAnchorSession_LocateAnchorsCompleted(object sender, LocateAnchorsCompletedEventArgs args){
        this.msg.text = "ASA Info: Locate anchors completed. Watcher identifier: " + args.Watcher.Identifier;
        Task.Run(async () =>{
            await Task.Delay(2500);
        });
        args.Watcher.Stop();
    }

Я использовал Azure Spatial Anchor SDK v1.1.0, Unity3D 2019.1.10f и Visual Studio 2017.

кто-нибудь знает причину?


person BroColly    schedule 21.08.2019    source источник
comment
Есть ли какое-либо сообщение об ошибке при возникновении ошибки? Пробовали ли вы восстановить код в исходное состояние для тестирования? В коде туториала не слишком много якорей. Это не должно вызывать ошибку сбоя игры из-за создания слишком большого количества потоков, поэтому нет необходимости добавлять задержку в конце цикла.   -  person Hernando - MSFT    schedule 22.08.2019
comment
@Hernando Я новичок в hololens, поэтому не знаю, как лучше всего просматривать журнал ошибок. Я обнаружил, что отображение журнала ошибок в Text GameObject вызывает сбой, хотя я не знаю, почему. Теперь мои приложения работают без проблем после того, как я прокомментировал все this.msg.text = code in function. Я также пытался восстановить исходный код состояния в учебнике, и приложения внезапно аварийно завершают работу после отображения журнала в Text GameObject сразу после начала сеанса.   -  person BroColly    schedule 22.08.2019
comment
Спасибо за ваш вклад. Эта проблема была решена.   -  person BroColly    schedule 22.08.2019


Ответы (1)


Поскольку большинство API Unity Engine можно вызывать только в основном потоке, обновления обновлений пользовательского интерфейса могут происходить только в основном потоке.

Дополнительную информацию см. в разделе Безопасность потоков в Unity.

person Hernando - MSFT    schedule 22.08.2019