Skip to content

动态 SCE 场景副本 Skill ​

适用范围 ​

当用户需要为玩家、房间、波次或测试流程创建多个相互隔离的 SCE 地图实例时,使用本 Skill。这里的“动态场景”指运行时复制已有 SCE 场景素材,不是凭空创建新的 GameGraph.SceneGraph。

标准路线 ​

  1. 在服务端默认场景初始化完成后,从已有 Scene 或 GameDataScene 获取模板。
  2. 调用 Scene.CreateCopy(...) 或 template.CreateCopy(...) 创建副本;显式名称必须唯一,空名称让框架自动生成。
  3. 按需设置 copy.DefaultCamera,再调用 copy.Load()。
  4. 在 copy.OnLoadEnd 后创建该实例专属的单位、物品、区域和脚本对象,并用 Player.SwitchScene(copy) 切换玩家。该调用默认不携带主控;需要原英雄与库存随行或副本往返时,按 角色跨场景迁移 选择迁移路线,并在玩家与英雄同场后恢复主控。
  5. 客户端如需等待副本身份同步,订阅 copy.OnReplicated 或 EventSceneReplicated;地图资源仍要等待 OnLoadEnd。

关键约束 ​

  • CreateCopy 是服务端 API,只能在默认场景初始化完成后调用。
  • 副本素材来源于源场景 HostedSceneTag.AssetTemplate,不会把 GameDataScene 的预放置对象自动复制到新实例。
  • 客户端 C++ 不会按副本到模板的关系自动读取模板默认镜头;副本按自己的场景名查询镜头,缺失时回退工程默认镜头。因此镜头覆盖应通过 Scene.DefaultCamera 传递。
  • 动态 SCE 副本与独立 SceneGraph 发布图是两条不同路线,不要用其中一条替代另一条。
  • 不要为此功能新增客户端 capability 判断;副本元数据走已有 PropertyObject 同步路径。

常见错误 ​

  • 在 OnGameSceneInitialization 之前调用 CreateCopy:应把创建动作延后到默认场景初始化完成之后。
  • 以为复制会带上预放置单位或区域:这些对象需要在副本加载后重新创建。
  • 只设置源场景默认镜头:客户端不会隐式回查模板,副本需要自己的镜头元数据。
  • 把场景副本当成纯 SceneGraph:前者由 SCE 场景系统和玩家切场景管理,后者由脚本管理发布和销毁。