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:
- Scripts em Standard Assets, Pro Standard Assets ou Plugins compilam primeiro (Assembly-CSharp-firstpass).
- Scripts em subpastas Editor dentro das anteriores compilam em seguida (Assembly-CSharp-Editor-firstpass).
- Scripts fora das pastas acima e fora de Assets/Editor compilam depois (Assembly-CSharp).
- 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).