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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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