Utilizando MultiThread no Unity 3D

Trabalhar com multitthread muitas vezes é algo necessário em qualquer linguagem e nem sempre é algo simples sendo importante realizar todo o gerenciamento de memoria e processamento para que o tudo funcione corretamente.

Além disso, podemos nos deparar com ambientes não muito amigáveis como por exemplo o Unity 3D na qual sua API não é thread-safe, mesmo já existam alternativas como as Coroutines as vezes precisamos de uma implementação diferente para que tudo funcione como queremos.

Nesse post estarei mostrando uma maneira encontrada de executar ações na Main Thread partindo de uma thread secundaria. Me deparei com essa situação no momento que estava desenvolvendo um biblioteca de conexão cliente-servidor, onde o meu jogo deveria chamar um método de acordo com os dados recebidos do servidor.

Vamos ao código!

Para iniciar, vamos criar um novo script no Unity que será responsável por receber e executar as ações.

Após criar a classe, crie um GameObject vazio e adicione o script UnityMainThread.

class UnityMainThread : MonoBehaviour    {  
      internal static Queue<Action> actions = new Queue<Action();
      internal static UnityMainThread wkr;
      
      void Awake(){
           wkr = this;
      }

      void Update(){
            while (actions.Count > 0){
                actions.Dequeue().Invoke();
            }
        }

        internal void AddJob(ActionnewJob){
            actions.Enqueue(newJob);
        }
    }

Nas threads secundarias, basta executar o método AddJob e passar a action via parametro.

UnityMainThread.AddJob(()=>{
    Debug.Log("Codigo executado pela MainThread do Unity");
});