Skip to content

4.6 Prefab SystemΒ #124

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions