ShitEngine 1.4.2
基于 C++20 与 SDL3 的轻量级 2D 游戏引擎
载入中...
搜索中...
未找到
Component.h
浏览该文件的文档.
1#pragma once
2#include "../Core/Config.h"
4
5#include <cstdint>
6
7namespace Shit {
8 class GameObject; // 前向声明
9 class System; // 前向声明(friend:系统销毁时重置认领组件的注册状态)
10
13
25 class SHIT_API SHIT_REFLECT(BlackList) Component {
26 friend class GameObject; // 只能通过GameObject初始化组件
27 friend class System; // 系统销毁时通过 System::resetComponent 重置组件注册状态
29
30 public:
32 virtual ~Component() = default;
33
34virtual void onCreate() {} // 组件创建时(有 owner,但可能尚未挂到场景)
35 virtual void onAttach() { m_isRegistered = true; } // 组件挂载到活动场景时(基类默认标记已注册;依赖系统的组件在找不到系统时自行置回 false 以便补挂)
36 virtual void onDetach() {} // 组件从场景卸下时
37 virtual void onDestroy() {} // 组件销毁时
38
41 virtual void onAfterDeserialize() {}
42
45 virtual void onFieldChanged(const std::string& fieldName) { (void)fieldName; }
46
47 // 禁止拷贝和移动
48 Component(const Component&) = delete;
49 Component& operator=(const Component&) = delete;
50 Component(Component&&) = delete;
52
53 GameObject* getOwner() const { return m_owner; }
54 bool isRegistered() const { return m_isRegistered; }
55
57 uint64_t getUuid() const { return m_uuid; }
59 void setUuid(uint64_t uuid) { m_uuid = uuid; }
60
61 private:
62 // 只允许 GameObject 设置
63 inline void setOwner(GameObject* owner) { m_owner = owner; }
64
65 protected:
66 // 内部:仅 System 通过 resetComponent 调用,用于系统注销后重置注册状态,
67 // 使已存在组件在同类系统重新注册时能被 System::init 补扫认领。
68 inline void setRegistered(bool registered) { m_isRegistered = registered; }
69
70 protected:
71 SHIT_META(({.displayName = "Owner", .readOnly = true}))
72 GameObject* m_owner = nullptr; // 组件的拥有者
73 SHIT_META(({.displayName = "Registered", .readOnly = true}))
74 bool m_isRegistered = false;
75 SHIT_META(Disable)
76 uint64_t m_uuid = 0;
77 };
78}
#define SHIT_API
定义 Core.h:14
反射标记宏(annotate 方案)——引擎反射系统的源码侧入口
#define SHIT_REFLECT_BODY(Type)
定义 Macros.h:89
#define SHIT_REFLECT(Mode)
定义 Macros.h:86
#define SHIT_META(...)
定义 Macros.h:95
friend class GameObject
定义 Component.h:26
void setRegistered(bool registered)
定义 Component.h:68
Component & operator=(Component &&)=delete
uint64_t m_uuid
持久 ID(构造时随机分配;0 仅在序列化前尚未赋值时短暂存在)
定义 Component.h:76
virtual void onFieldChanged(const std::string &fieldName)
检查器直接写反射字段后回调(字段名)。用于绕过 setter 的直写完成后 重新同步引擎状态(如 Box2D 刚体/形状)。默认无操作。
定义 Component.h:45
virtual void onDestroy()
定义 Component.h:37
virtual void onCreate()
定义 Component.h:34
virtual void onAttach()
定义 Component.h:35
Component(const Component &)=delete
uint64_t getUuid() const
组件持久 ID(随 .scene 序列化,是 ComponentRef<T> 引用字段的寻址依据)
定义 Component.h:57
GameObject * getOwner() const
定义 Component.h:53
GameObject * m_owner
定义 Component.h:72
Component(Component &&)=delete
virtual void onDetach()
定义 Component.h:36
bool isRegistered() const
定义 Component.h:54
virtual ~Component()=default
void setUuid(uint64_t uuid)
直接设置组件 ID(仅引擎反序列化/索引维护使用;正常流程由构造函数随机分配)
定义 Component.h:59
Component & operator=(const Component &)=delete
virtual void onAfterDeserialize()
反序列化完成后回调(Prefab::apply 逐组件调用一次,字段已写入)。 用于重建"直写字段绕过了 setter、无法自动触发的引擎状态"(如精灵纹理加载)。
定义 Component.h:41
bool m_isRegistered
定义 Component.h:74
friend class System
定义 Component.h:27
游戏物体类
定义 GameObject.h:23
System 基类
定义 System.h:19
定义 AnimationClip.h:12
uint64_t GenerateComponentUuid()
生成随机组件 UUID(64 位;0 保留为空引用,永不返回 0)