Unity3d - функция обновления останавливается при получении сообщения MQTT? - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь создать простое приложение MQTT. Я хочу отобразить полученное сообщение MQTT в 3dText с Unity.

Я поместил строковое назначение в функцию Update (), но, как видно, при получении сообщения функция Update () останавливается. Когда я щелкаю где-нибудь в редакторе, функция Update () просыпается и обновляет строку.

C #

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Net;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;
using uPLibrary.Networking.M2Mqtt.Utility;
using uPLibrary.Networking.M2Mqtt.Exceptions;

using System;

public class mqttTest : MonoBehaviour {
    private MqttClient client;
    public TextMesh mytext=null;
    string msg;
    // Use this for initialization
    void Start () {

        // create client instance 
        client = new MqttClient(IPAddress.Parse("192.168.83.128"),1883 , false , null ); 

        // register to message received 
        client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; 

        string clientId = Guid.NewGuid().ToString(); 
        client.Connect(clientId); 


        client.Subscribe(new string[] { "test" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE }); 


    }

    void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e) 
    { 
        msg = System.Text.Encoding.UTF8.GetString(e.Message);
        Debug.Log("Received: " + msg  );

    }


    // Update is called once per frame
    void Update () {
        Debug.Log("update");

        mytext.text = msg;

    }
}

Эта остановка вызвана средой разработки или механизмом событий?

1 Ответ

0 голосов
/ 03 мая 2019

Это, вероятно, потому, что Unity выполняет только PlayMode (Update события и т. Д.), В то время как окно UnityEditor и, в частности, Game view сфокусировано. Если другое окно имеет или получает фокус в момент получения вашего сообщения, Unity останавливается до тех пор, пока Game view редактора единиц не снова фокусируется.


Вы можете это исправить, перейдя в Настройки игрока & rightarrow; Resolution and Presentation & rightarrow; Resolution и включить опция

Запуск в фоновом режиме
Включите эту опцию, чтобы игра продолжала работать (а не приостанавливалась), если приложение теряет фокус.

Очевидно, это также относится и к игроку в самом UnityEditor.

Однако он работает / существует только в том случае, если целью вашего проекта является «Автономный» или «Интернет».


Для iOS и Android это не работает, потому что на этих устройствах приложение не может работать в фоновом режиме. Unity автоматически также применяет то же поведение к игроку внутри самого UnityEditor.

Но вы все равно можете обойти его настройкой Application.runInBackground (что в принципе и делает упомянутый выше вариант)

Должен ли проигрыватель работать, когда приложение находится в фоновом режиме?

По умолчанию false (приложение останавливается, когда оно находится в фоновом режиме).

непосредственно из компонента (прикрепленного к любому игровому объекту Scene), например

public class EditorRunInBackground : MonoBehaviour
{
    private void Awake () 
    {
        if (Application.isEditor) Application.runInBackground = true;
    }
}

, который устанавливает runInBackground только для самого UnityEditor.

В качестве альтернативы, если вы не хотите прикреплять его к чему-либо, вы также можете использовать скрипт с [RuntimeInitializeOnLoadMethod]

public static class EditorRunInBackground
{
    [RuntimeInitializeOnLoadMethod]
    private static void OnRuntimeMethodLoad()
    {
        if(Application.isEditor) Application.runInBackground = true;
    }
}

и может даже воспроизводить его в папке Editor, поэтому его удаляют в сборке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...