Componentes

Esta página foi traduzida automaticamente e pode conter erros. Encontrou um problema? Use o link "Edit this page" para ajudar a corrigir.

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 como false para 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 pub e 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:

  1. Constrói o nó e todos os seus componentes (inicializados com zero).
  2. Chama awake em cada componente — o componente sabe que existe e pode configurar o estado interno, mas não deve assumir que outros nós estejam prontos.
  3. Chama enable em cada componente — o componente torna-se ativo. Se o nó começar desativado, o enable é adiado até que o nó seja ativado.
  4. Uma vez que todos os nós estejam carregados e ativados, chama start em 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):

  1. Chama update em 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

  1. disable — chamado quando um nó é desativado (ex: visibilidade desligada, pai desativado), imediatamente ou no final do quadro atual.
  2. destroy — chamado quando um nó é removido da cena. Após o retorno do destroy, 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


← Toda a documentação Editar esta página