π§ 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
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.
π§ Prefab System
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
LΓ³gica de PropagaΓ§Γ£o (Pseudo-C++)
Diagrama de Hierarquia e Overrides (ASCII)
DecisΓ΅es de Design
CritΓ©rio de AceitaΓ§Γ£o
DependΓͺncias
docs/ecs/scene.md(necessΓ‘rio para a gestΓ£o de entidades e componentes)docs/editor/scene-editor.md(integraΓ§Γ£o visual na hierarquia)π TΓ³picos Relacionados
.prefab.cafsΓ£o visualizados e geridos.ReferΓͺncias