Componentes
Um componente é uma struct pura do Zig que opta pela descoberta do editor. Não há classe base para herdar nem boilerplate de registro — um único marcador é suficiente.
Marcando uma struct como componente
pub const Health = struct {
pub const is_component = true;
max: f32 = 100.0,
current: f32 = 100.0,
};
pub const is_component = true;marca a struct para descoberta. Defina comofalsepara desativar temporariamente sem excluir a struct.- O editor faz o parse de código-fonte Zig real (não uma regex), então o marcador funciona independentemente de formatação, comentários ou compilação condicional.
- A struct deve ser
pube seu nome deve começar com uma letra maiúscula. - Os nomes dos tipos de componentes devem ser únicos em todo o projeto. Duplicatas são reportadas e a segunda definição é ignorada.
Os scripts do usuário residem na pasta assets/ do seu projeto. Depois de adicionar ou editar um script, clique em Refresh no Asset Browser para escanear novamente.
Tipos de campos suportados
Campos públicos com um valor padrão tornam-se controles editáveis no Inspector.
| Tipo | Controle do Inspector |
|---|---|
f32 |
campo numérico |
i32 |
campo de número inteiro |
bool |
caixa de seleção (checkbox) |
engine.Vec3 |
campo de vetor de três eixos |
engine.GameObjectRef |
destino de soltar (drop target) — arraste um objeto da Hierarchy |
engine.ComponentRef |
destino de soltar — referencia outro componente |
engine.AssetRef |
destino de soltar — referencia um asset |
Campos prefixados com _ (ex: _timer) são tratados como estado de runtime privado e não são mostrados no Inspector.
Ciclo de vida do nó
Cada nó em uma cena segue um ciclo de vida determinístico desde o momento em que é carregado até ser destruído. Componentes anexados ao nó recebem callbacks do ciclo de vida em cada etapa.
Ordem de carregamento e ativação
Quando uma cena é carregada, os nós são processados na ordem de travessia em profundidade (depth-first). Para cada nó, o engine:
- Constrói o nó e todos os seus componentes (inicializados com zero).
- Chama
awakeem cada componente — o componente sabe que existe e pode configurar o estado interno, mas não deve assumir que outros nós estejam prontos. - Chama
enableem cada componente — o componente torna-se ativo. Se o nó começar desativado, oenableé adiado até que o nó seja ativado. - Uma vez que todos os nós estejam carregados e ativados, chama
startem cada componente na mesma ordem de profundidade — neste ponto, todos os nós na cena existem e todos os componentes foram acordados.
Atualização por quadro (frame)
Após o start, o engine entra no loop de atualização (update loop). A cada quadro (frame):
- Chama
updateem cada componente ativado — é aqui que a lógica de jogabilidade (gameplay) é executada (movimento, input, spawning). A ordem de atualização dentro de um frame é determinística, mas não especificada; não dependa de um componente atualizar antes do outro no mesmo frame.
Desativação e destruição
disable— chamado quando um nó é desativado (ex: visibilidade desligada, pai desativado), imediatamente ou no final do quadro atual.destroy— chamado quando um nó é removido da cena. Após o retorno dodestroy, a memória do componente é liberada.
Resumo
Construct → awake → enable → start → [update × frames] → disable → destroy
Hooks de ciclo de vida
Todos os hooks são opcionais — implemente apenas os que você precisar.
| Hook | Chamado quando |
|---|---|
awake(self) ou awake(self, frame: engine.Frame) |
O objeto é carregado pela primeira vez — use para autoconfiguração que não dependa de outros objetos |
enable(self) ou enable(self, frame: engine.Frame) |
O objeto torna-se ativo — ideal para assinar eventos ou iniciar temporizadores (timers) |
start(self) ou start(self, frame: engine.Frame) |
A cena começa a rodar — todos os nós da cena estão prontos; seguro para resolver referências de objetos |
update(self, frame: engine.Frame) |
A cada quadro (frame) (preferencial) — lógica principal da jogabilidade |
update(self, time: engine.Time) |
A cada quadro (frame) (legado) |
disable(self) ou disable(self, frame: engine.Frame) |
O objeto torna-se inativo — cancele a assinatura de eventos, pause temporizadores |
destroy(self) ou destroy(self, frame: engine.Frame) |
O objeto é destruído — limpeza final, liberação de recursos |
O contexto engine.Frame agrupa tudo o que um script precisa: frame.time, frame.input, frame.transform, frame.objects e frame.services. Veja a página do Sistema de Input para uma referência completa de campos.
engine.Time
| Campo | Tipo | Significado |
|---|---|---|
.delta |
f32 |
segundos desde o último quadro (frame) |
.elapsed |
f32 |
total de segundos desde o início da cena |
.frame |
u64 |
contador de quadros (frames) |
Componentes nativos
Os componentes nativos são distribuídos com o engine e não requerem scripts. Adicione-os através de Add Component ▾ no Inspector. Escrever seu próprio componente nativo é uma tarefa de contribuidor — veja Compilando da Fonte (Building from Source).
Próximos passos
- Siga o Tutorial para um guia prático passo a passo.
- Veja a Referência da CLI para compilar (build) e empacotar sem o editor.