๐ง 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