diff --git a/Engine/include/Engine/Scripting/Script.h b/Engine/include/Engine/Scripting/Script.h index 2500dfb..2efa583 100644 --- a/Engine/include/Engine/Scripting/Script.h +++ b/Engine/include/Engine/Scripting/Script.h @@ -118,6 +118,18 @@ namespace Engine { // spawn:帧内即时创建(UUID + Transform + Name 出生即有), // 组件由脚本自行 AddComponent 装配;RigidBody/ScriptComponent // 分别由 PhysicsWorld/ScriptRuntime 下一帧对账消化 + // + // 【选型约定:Spawn vs Instantiate】(Unity/UE 同题,靠约定 + // 治理,判定只有一问): + // "这东西的参数要不要让非程序员改?" + // 要 → Save As Prefab + Instantiate(数据 = 真理来源) + // 不要 → Spawn(代码 = 真理来源:子弹/特效触发器等纯逻辑体) + // 三条纪律: + // 1. 一个对象只走一条路径——prefab 化后 Spawn 版本撤注册; + // 2. Spawn 的脚本构造保持"零参数搭建":发现 Spawn 后手动 + // set 一堆组件 = 该 prefab 化的信号; + // 3. 注册表即白名单(ENGINE_REGISTER_SCRIPT 的类才能按名 + // spawn),别为绕过约定注册"伪逻辑体"。 ECS::EntityHandle Spawn(const std::string& name); // destroy:延迟——入队,帧尾 FlushDestroyQueue 统一执行 //(遍历安全);调用方持有的句柄此后悬空 @@ -273,7 +285,12 @@ namespace Engine { } // namespace Engine // 文件级自注册:脚本 cpp 里写一行即可,Inspector 下拉与序列化按 -// 类名(字符串)解析。T 须默认可构造并继承 ScriptBehavior +// 类名(字符串)解析。T 须默认可构造并继承 ScriptBehavior。 +// +// 注册 = UE 的 UCLASS(Blueprintable) 表态:本类声明为"逻辑体"—— +// 允许运行时按名 Spawn(脚本 Spawn()/运行时注册表白名单)。需要 +// 美术调参/编辑器复用的组合体不要注册(走 Save As Prefab + +// Instantiate 路径),防止同一对象出现 Spawn/prefab 两条权威链 #define ENGINE_REGISTER_SCRIPT(T) \ static const bool s_##T##_registered = [] { \ ::Engine::Scripting::ScriptRegistry::Register( \