主题
动态 SCE 场景副本 Skill
适用范围
当用户需要为玩家、房间、波次或测试流程创建多个相互隔离的 SCE 地图实例时,使用本 Skill。这里的“动态场景”指运行时复制已有 SCE 场景素材,不是凭空创建新的 GameGraph.SceneGraph。
标准路线
- 在服务端默认场景初始化完成后,从已有
Scene或GameDataScene获取模板。 - 调用
Scene.CreateCopy(...)或template.CreateCopy(...)创建副本;显式名称必须唯一,空名称让框架自动生成。 - 按需设置
copy.DefaultCamera,再调用copy.Load()。 - 在
copy.OnLoadEnd后创建该实例专属的单位、物品、区域和脚本对象,并用Player.SwitchScene(copy)切换玩家。该调用默认不携带主控;需要原英雄与库存随行或副本往返时,按 角色跨场景迁移 选择迁移路线,并在玩家与英雄同场后恢复主控。 - 客户端如需等待副本身份同步,订阅
copy.OnReplicated或EventSceneReplicated;地图资源仍要等待OnLoadEnd。
关键约束
CreateCopy是服务端 API,只能在默认场景初始化完成后调用。- 副本素材来源于源场景
HostedSceneTag.AssetTemplate,不会把GameDataScene的预放置对象自动复制到新实例。 - 客户端 C++ 不会按副本到模板的关系自动读取模板默认镜头;副本按自己的场景名查询镜头,缺失时回退工程默认镜头。因此镜头覆盖应通过
Scene.DefaultCamera传递。 - 动态 SCE 副本与独立
SceneGraph发布图是两条不同路线,不要用其中一条替代另一条。 - 不要为此功能新增客户端 capability 判断;副本元数据走已有
PropertyObject同步路径。
常见错误
- 在
OnGameSceneInitialization之前调用CreateCopy:应把创建动作延后到默认场景初始化完成之后。 - 以为复制会带上预放置单位或区域:这些对象需要在副本加载后重新创建。
- 只设置源场景默认镜头:客户端不会隐式回查模板,副本需要自己的镜头元数据。
- 把场景副本当成纯
SceneGraph:前者由 SCE 场景系统和玩家切场景管理,后者由脚本管理发布和销毁。