Skip to content

4.6 Prefab SystemΒ #124

@LyeZinho

Description

@LyeZinho

πŸ”§ Prefab System

Milestone: M4 β€” Advanced Tools & Polish
Namespace: Caffeine::Editor
Arquivos: src/editor/PrefabSystem.hpp, src/editor/PrefabSystem.cpp
Status: πŸ“… Planeado
RF: RF6.6


VisΓ£o Geral

O Prefab System Γ© uma ferramenta fundamental para a escalabilidade e reutilizaΓ§Γ£o de conteΓΊdo no Caffeine Studio. Um "Prefab" (abreviatura de Prefabricated) Γ© um modelo de entidade ou hierarquia de entidades que pode ser guardado como um asset (.prefab.caf) e instanciado mΓΊltiplas vezes em diferentes cenas.

A principal forΓ§a deste sistema reside na sua natureza dinΓ’mica: qualquer alteraΓ§Γ£o feita no ficheiro original do Prefab propaga-se automaticamente para todas as suas instΓ’ncias na cena. No entanto, o sistema tambΓ©m suporta "Overrides", permitindo que instΓ’ncias especΓ­ficas tenham valores de propriedades diferentes (ex: uma posiΓ§Γ£o ou cor ΓΊnica) sem quebrar a ligaΓ§Γ£o com o modelo base. O suporte para "Prefab Nesting" permite criar prefabs complexos a partir de prefabs mais simples (ex: um prefab de Carro que contΓ©m prefabs de Rodas).


ImplementaΓ§Γ£o

O sistema gere a relaΓ§Γ£o entre o asset em disco e as entidades instanciadas atravΓ©s de um ID de ligaΓ§Γ£o (PrefabID).

Estrutura do Sistema de Prefabs

namespace Caffeine::Editor {

struct PrefabOverride {
    UUID entityID;
    std::string componentName;
    std::string propertyName;
    std::variant<int, float, std::string, glm::vec3> value;
};

class PrefabInstanceComponent {
public:
    UUID prefabSourceID;
    std::vector<PrefabOverride> overrides;
    
    bool IsOverridden(const std::string& comp, const std::string& prop) const;
};

class PrefabManager {
public:
    // Criar um novo asset de prefab a partir de uma entidade existente
    static Ref<Prefab> CreateFromEntity(Entity entity, const std::string& path);
    
    // Instanciar um prefab na cena ativa
    static Entity Instantiate(Ref<Prefab> prefab, Scene* scene);
    
    // Aplicar alteraΓ§Γ΅es de uma instΓ’ncia de volta para o asset (Push changes)
    static void ApplyOverridesToPrefab(Entity instance);
    
    // Reverter uma instΓ’ncia para o estado original do asset
    static void RevertOverrides(Entity instance);

private:
    static void PropagateChanges(Ref<Prefab> prefab);
};

} // namespace Caffeine::Editor

LΓ³gica de PropagaΓ§Γ£o (Pseudo-C++)

void PrefabManager::PropagateChanges(Ref<Prefab> prefab) {
    auto activeScenes = Editor::GetActiveScenes();
    for (auto scene : activeScenes) {
        auto view = scene->m_registry.view<PrefabInstanceComponent>();
        for (auto entity : view) {
            auto& instance = view.get<PrefabInstanceComponent>(entity);
            if (instance.prefabSourceID == prefab->ID) {
                // Atualizar componentes, mantendo os overrides locais
                UpdateInstanceFromPrefab(entity, prefab, instance.overrides);
            }
        }
    }
}

Diagrama de Hierarquia e Overrides (ASCII)

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Scene Hierarchy                                             β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ β–Ό Scene_Main                                                β”‚
β”‚   β–Έ Camera                                                  β”‚
β”‚   β–Έ Light_Directional                                       β”‚
β”‚   β–Ό [🟦] Prefab: Hero_Instance_01  (Linked)                 β”‚
β”‚     └─ [πŸ”Ή] Transform  [pos: 10, 0] <-- OVERRIDDEN          β”‚
β”‚     └─ [πŸ”Ή] Sprite     [id: hero_idle]                      β”‚
β”‚     └─ [πŸ”Ή] Script     [path: player.lua]                   β”‚
β”‚   β–Ό [🟦] Prefab: Enemy_Instance_A                           β”‚
β”‚     └─ [πŸ”Ή] Transform  [pos: 50, 20]                        β”‚
β”‚     └─ [πŸ”Ή] Sprite     [id: enemy_bat]                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Inspector (Hero_Instance_01)                                β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ [Prefab Controls]   [Revert All] [Apply to Prefab]          β”‚
β”‚                                                             β”‚
β”‚ [x] Transform                                               β”‚
β”‚     - Position: [ 10.0 ] [  0.0 ]  <-- (Texto a Negrito)    β”‚
β”‚ [ ] Sprite                                                  β”‚
β”‚     - Texture: [ hero_idle    ]  [v]                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

DecisΓ΅es de Design

DecisΓ£o Justificativa
GravaΓ§Γ£o em Formato BinΓ‘rio Otimiza o carregamento de grandes quantidades de instΓ’ncias durante o runtime.
Sistema de Overrides Granular Permite personalizaΓ§Γ£o extrema sem perder a facilidade de manutenΓ§Γ£o global.
Prefab Nesting Crucial para projetos complexos onde objetos sΓ£o compostos por outros sub-objetos modulares.
Ícones Distintos na Hierarquia Ajuda o utilizador a identificar rapidamente o que é um objeto único e o que é uma instÒncia de um template.

CritΓ©rio de AceitaΓ§Γ£o

  • CriaΓ§Γ£o de Prefabs a partir de qualquer entidade via drag-and-drop para o Asset Browser.
  • InstanciaΓ§Γ£o correta de Prefabs no Scene Viewport mantendo a hierarquia original.
  • DeteΓ§Γ£o automΓ‘tica de alteraΓ§Γ΅es em propriedades e marcaΓ§Γ£o como "Override".
  • BotΓ£o "Apply" que guarda as alteraΓ§Γ΅es da instΓ’ncia no asset base.
  • BotΓ£o "Revert" que descarta overrides locais e restaura os valores do asset.

DependΓͺncias

  • Upstream: docs/ecs/scene.md (necessΓ‘rio para a gestΓ£o de entidades e componentes)
  • Downstream: docs/editor/scene-editor.md (integraΓ§Γ£o visual na hierarquia)

πŸ”— TΓ³picos Relacionados

TΓ³pico DescriΓ§Γ£o
ECS Core Como as entidades e componentes sΓ£o estruturados internamente.
Serialization O processo de converter entidades em ficheiros YAML/BinΓ‘rio.
Asset Browser Onde os ficheiros .prefab.caf sΓ£o visualizados e geridos.

ReferΓͺncias

  • AnΓ‘lise do sistema de Prefabs do Unity e Blueprint Classes do Unreal Engine.
  • PadrΓ£o de design "Prototype" aplicado a sistemas de entidades.
  • TΓ©cnicas de diff e merge de dados para reconciliaΓ§Γ£o de overrides.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions