Ordem de Execução e Compilação de Scripts no Unity3D

No Unity, múltiplos scripts podem ser criados e vinculados a diferentes objetos do jogo, cada um executando em seu próprio ciclo de vida. A relação entre scripts envolve compilação e execução. Este artigo explora a ordem de compilação e execução de scripts no Unity.

Ordem de Execução de Funções de Evento

A ordem de execução das funções de evento em scripts segue um padrão definido. Para testar isso, crie três objetos de jogo e três scripts, vinculando-os sequencialmente. Os scripts possuem código idêntico, com distinção apenas nos nomes.

public class ScriptA : MonoBehaviour { void Awake() { Debug.Log("ScriptA — Awake chamado"); }

bool updateExecuted = false;
void Update()
{
    if (!updateExecuted)
    {
        Debug.Log("ScriptA — Update chamado");
        updateExecuted = true;
    }
}

bool lateUpdateExecuted = false;
void LateUpdate()
{
    if (!lateUpdateExecuted)
    {
        Debug.Log("ScriptA — LateUpdate chamado");
        lateUpdateExecuted = true;
    }
}

}


</div>Ao executar o jogo, a ordem de execução de Awake, Update e LateUpdate permanece consistente em todas as execuções.

Em seguida, remova o método Update do ScriptA e execute novamente.

<div class="code-block">```
using UnityEngine;

public class ScriptA : MonoBehaviour
{
    void Awake()
    {
        Debug.Log("ScriptA — Awake chamado");
    }

    // Método Update removido para teste

    bool lateUpdateExecuted = false;
    void LateUpdate()
    {
        if (!lateUpdateExecuted)
        {
            Debug.Log("ScriptA — LateUpdate chamado");
            lateUpdateExecuted = true;
        }
    }
}

Esses testes demonstram que, nos bastidores, o Unity agrega todas as funções de evento (Awake, Start, Update, LateUpdate, FixedUpdate, etc.) de todos os scripts em uma ordem específica. Por exemplo, a execução de Awake pode ser representada concietualmente como:


</div>Da mesma forma, Update e outras funções seguem uma ordem similar, garantindo que todos os scripts concluam uma fase antes de avançarem para a próxima.

### Configuração da Ordem de Execução

Considere um cenário onde ScriptA cria um cubo no Awake, e ScriptC tenta encontrá-lo no Awake.

<div class="code-block">```
// ScriptA.cs
using UnityEngine;

public class ScriptA : MonoBehaviour
{
    void Awake()
    {
        GameObject.CreatePrimitive(PrimitiveType.Cube);
    }
}

// ScriptC.cs
using UnityEngine;

public class ScriptC : MonoBehaviour
{
    void Awake()
    {
        GameObject cube = GameObject.Find("Cube");
        if (cube != null)
            Debug.Log(cube.name);
    }
}

Acesse Edit → Project Settings → Script Execution Order no editor. Clique no "+" para adicionar scripts e arraste-os para definir prioridades. Scripts com números menores executam primeiro. O "Default Time" aplica-se a scripts sem configuração explícita.

Ordem de Compilação

A ordem de compilação de scripts no Unity depende da localização dos arquivos e das pastas especiais. O Unity suporta três linguagens de script (C#, UnityScript, Boo), cada uma compilada em um assembly CLI (DLL).

Para scripts em C#, o Unity gera projetos com prefixos como "Assembly-CSharp". A existência de pastas como Standard Assets, Plugins ou Editor influencia a ordem de compilação. A seguir, um exemplo de estrutura de pastas e os projetos gerados:

  • Ordem de compilação:
    1. Scripts em Standard Assets, Pro Standard Assets ou Plugins compilam primeiro (Assembly-CSharp-firstpass).
    2. Scripts em subpastas Editor dentro das anteriores compilam em seguida (Assembly-CSharp-Editor-firstpass).
    3. Scripts fora das pastas acima e fora de Assets/Editor compilam depois (Assembly-CSharp).
    4. Scripts em Assets/Editor compilam por último (Assembly-CSharp-Editor).

Essa ordem respeita dependências entre assemblies. Em um projeto com múltiplas linguagens, o Unity gera até quatro variantes de projeto por linguagem (considerando firstpass e Editor).

Para calcular o número máximo de arquivos de projeto em um Unity3D com três linguagens e quatro variantes: 3 linguagens × 4 variantes = 12 projetos (considerando apenas uma plataforma, mas incluindo variantes para VS e MonoDevelop, o total pode chegar a 24 em configurações específicas).

Tags: Unity3D C# scripting Execution Order Compilation Order

Publicado em 6-11 00:18 por Thomas