View in English

  • Apple 开发者
    • 入门汇总

    探索“入门汇总”

    • 概览
    • 学习
    • Apple Developer Program

    及时了解最新动态

    • 最新动态
    • 开发者你好
    • 平台

    探索“平台”

    • Apple 平台
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    • App Store

    精选

    • 设计
    • 分发
    • 游戏
    • 配件
    • 网页
    • Home
    • CarPlay 车载
    • 技术

    探索“技术”

    • 概览
    • Xcode
    • Swift
    • SwiftUI

    精选

    • 辅助功能
    • App Intents
    • Apple 智能
    • 游戏
    • 机器学习与 AI
    • 安全性
    • Xcode Cloud
    • 社区

    探索“社区”

    • 概览
    • “与 Apple 会面交流”活动
    • 社区主导的活动
    • 开发者论坛
    • 开源

    精选

    • WWDC
    • Swift Student Challenge
    • 开发者故事
    • App Store 大奖
    • Apple 设计大奖
    • Apple Developer Centers
    • 文档

    探索“文档”

    • 文档库
    • 技术概述
    • 示例代码
    • 《人机界面指南》
    • 视频

    发布说明

    • 精选更新
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • Apple tvOS
    • Xcode
    • 下载

    探索“下载”

    • 所有下载
    • 操作系统
    • 应用程序
    • 设计资源

    精选

    • Xcode
    • TestFlight
    • 字体
    • SF Symbols
    • Icon Composer
    • 支持

    探索“支持”

    • 概览
    • 帮助指南
    • 开发者论坛
    • “反馈助理”
    • 联系我们

    精选

    • 《开发者账户帮助》
    • 《App 审核指南》
    • 《App Store Connect 帮助》
    • 即将实行的要求
    • 协议和准则
    • 系统状态
  • 快速链接

    • 活动
    • 新闻
    • 论坛
    • 示例代码
    • 视频
 

视频

打开菜单 关闭菜单
  • 专题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 代码
  • 使用 Xcode 扩展 Reality Composer Pro 3 的功能

    探索 Reality Composer Pro 3 如何助你构建规模更大、更具雄心的空间项目。了解如何创建项目专属插件,以便编辑自定组件、运行自定系统,并构建自己的 ScriptGraph 节点,从而全面掌控你的空间创作工作流程。

    章节

    • 0:00 - Introduction
    • 2:00 - Extending the editor
    • 4:51 - Custom components and systems
    • 10:32 - Controlling the water surface
    • 13:19 - Custom animation actions
    • 17:12 - Custom Script Graph nodes
    • 21:16 - Next steps

    资源

      • 高清视频
      • 标清视频

    相关视频

    WWDC26

    • 使用 Reality Composer Pro 3 加速你的空间工作流程
    • 使用 Reality Composer Pro 3 加速空间场景迭代
    • 使用 Reality Composer Pro 3 设计无代码游戏
    • 探索 RealityKit 的新进展
  • 搜索此视频…
    • 6:08 - Cauldron component

      // Add a component to represent the water level
      
      import RealityKit
      
      public struct Cauldron: Component, Codable {
          public var waterLevel: Float
      
          enum CodingKeys: CodingKey {
              case waterLevel
          }
      }
    • 6:42 - CauldronSystem

      // Add a system to control the water level
      
      import RealityKit
      
      public struct CauldronSystem: System {
          let query = EntityComponentQuery(Cauldron.self)
          public init(scene: Scene) {}
      
          public func update(context: SceneUpdateContext) {
              for (entity, cauldron) in context.entities(matching: query) {
                  guard let water = entity.findEntity(named: "Cauldron_Water_mesh")
                      else { continue }
                  water.setPosition(SIMD3<Float>(0, 1, 0) * cauldron.waterLevel, relativeTo: entity)
              }
          }
      }
    • 7:00 - RCPCustomComponentsPlugin

      // Make sure that Reality Composer Pro 3 knows about the Cauldron and CauldronSystem
      
      import RealityComposerPro
      
      final class RCPCustomComponentsPlugin: RealityComposerProPlugin {
          public func setup(context: any RealityComposerProContext) {
              context.registerComponent(Cauldron.self)
              context.registerSystem(CauldronSystem.self)
          }
      }
      
      @_cdecl("createRealityComposerProPlugin")
      public func createRealityComposerProPlugin() -> UnsafeMutableRawPointer {
          return RCPCustomComponentsPlugin().passRetained()
      }
    • 10:49 - Cauldron component with vortex properties

      // Properties to control water surface
      
      import RealityKit
      
      public struct Cauldron: Component, Codable {
          public var waterLevel: Float
          public var rotationSpeed: Float
          public var minWaterLevel: Float
          public var maxWaterLevel: Float
          public var vortexCoeff: Float
      }
    • 11:05 - CauldronSystem update with ShaderGraph

      public func update(context: SceneUpdateContext) {
          for (entity, cauldron) in context.entities(matching: query) {
              guard let water = entity.findEntity(named: "Cauldron_Water_mesh") else { continue }
              water.setPosition(SIMD3<Float>(0, 1, 0) * cauldron.waterLevel, relativeTo: entity)
      
              guard var model = water.components[ModelComponent.self] else { continue }
              guard var mat = model.materials.first as? ShaderGraphMaterial else { continue }
              let surface = computeSurface(cauldron: cauldron)
              try? mat.setParameter(name: "Level Radius", value: .float(surface.levelRadius))
              try? mat.setParameter(name: "Lowest Point",
                  value: .float(cauldron.waterLevel - surface.lowestPoint))
              try? mat.setParameter(name: "Height Change", value: .float(surface.heightChange))
              try? mat.setParameter(name: "Level Coeff", value: .float(surface.levelCoeff))
              try? mat.setParameter(name: "Is Level", value: .bool(surface.isLevel))
              model.materials[0] = mat
              water.components.set(model)
          }
      }
    • 13:25 - SetWaterLevelAction

      // Custom action for setting the water level of the Cauldron
      
      import RealityKit
      
      public struct SetWaterLevelAction: EntityAction, Codable {
          // Parameters for the action
          public let startWaterLevel: Float
          public let endWaterLevel: Float
      
          // Required by EntityAction protocol
          public var animatedValueType: (any AnimatableData.Type)? { Transform.self }
      }
    • 14:05 - SetWaterLevelAction subscribe

      extension SetWaterLevelAction {
          static func subscribe() {
              Task { @MainActor in
                  SetWaterLevelAction.subscribe(to: .updated) { event in
                      let normalizedTime = (event.playbackController.time - event.startTime) /
                          event.duration
                      let action = event.action
                      let currentLevel = action.startWaterLevel +
                          Float(normalizedTime) * (action.endWaterLevel - action.startWaterLevel)
                      guard let entity = event.targetEntity else { return }
                      guard var cauldron = entity.components[Cauldron.self] else { return }
                      cauldron.waterLevel = currentLevel
                      entity.components.set(cauldron)
                  }
              }
          }
      }
    • 14:56 - RCPCustomComponentsPlugin with action

      // Make sure that Reality Composer Pro 3 knows about the SetWaterLevelAction
      
      import RealityComposerPro
      
      final class RCPCustomComponentsPlugin: RealityComposerProPlugin {
          public func setup(context: any RealityComposerProContext) {
              context.registerComponent(Cauldron.self)
              context.registerSystem(CauldronSystem.self)
      
              context.registerAction(SetWaterLevelAction.self)
              SetWaterLevelAction.subscribe()
          }
      }
      
      @_cdecl("createRealityComposerProPlugin")
      public func createRealityComposerProPlugin() -> UnsafeMutableRawPointer {
          return RCPCustomComponentsPlugin().passRetained()
      }
    • 17:32 - Cauldron with @Scriptable macro

      // Expose Cauldron to Script Graphs
      
      import RealityKit
      import RealityKitScripting
      import RealityKitScriptingMacros
      
      @Scriptable
      public struct Cauldron: Component, Codable {
          public var waterLevel: Float
          public var rotationSpeed: Float
          public var minWaterLevel: Float
          public var maxWaterLevel: Float
          public var vortexCoeff: Float
      }
    • 18:08 - Register scripting module

      // Register scripting module
      
      public func setup(context: any RealityComposerProContext) {
          context.registerComponent(Cauldron.self)
          context.registerSystem(CauldronSystem.self)
      
          context.registerAction(SetWaterLevelAction.self)
          SetWaterLevelAction.subscribe()
      
          Task { @MainActor in
              let config = RKS.Configuration(id: "ChaparralVillage")
                  .onInitialize { _ in
                  [
                      Module("ChaparralVillage") {
                          Cauldron.SchemaProvider.schema
                      }
                  ]
              }
              try! RKS.addConfiguration(config)
          }
      }
    • 0:00 - Introduction
    • An overview of the Reality Composer Pro 3 plugin system, showing how Xcode and the editor share a project to let engineers and artists collaborate — with custom components, systems, animation actions, and Script Graph nodes all running live inside the editor.

    • 2:00 - Extending the editor
    • Learn how the Reality Composer Pro 3 plugin system works: how the editor and Xcode share a single git repository, how custom Swift code is compiled into a dynamic library, and how the editor loads and trusts plugins at runtime.

    • 4:51 - Custom components and systems
    • Build a Cauldron component and CauldronSystem using RealityKit, expose them to the editor via a RealityComposerProPlugin, and see the water level property update in real time as artists adjust values in the inspector.

    • 10:32 - Controlling the water surface
    • Extend the Cauldron component with vortex shader properties and update the system to drive a ShaderGraphMaterial at runtime, enabling artists to control vortex depth and rotation speed directly from the Reality Composer Pro 3 inspector.

    • 13:19 - Custom animation actions
    • Implement the EntityAction protocol to create a SetWaterLevelAction that animates the cauldron water level on the sequencer timeline, subscribe to animation update events to interpolate the level, and register the action with the editor plugin.

    • 17:12 - Custom Script Graph nodes
    • Use the @Scriptable macro to expose a custom component to Reality Composer Pro 3 Script Graphs, register a scripting module in the plugin setup, and see the generated nodes appear in the Script Graph editor for no-code artist workflows.

    • 21:16 - Next steps
    • Recap of the plugin capabilities covered — custom components, systems, animation actions, and Script Graph nodes — with recommendations to explore the Explore Advances in RealityKit and Supercharge Your Spatial Workflows sessions.

Developer Footer

  • 视频
  • WWDC26
  • 使用 Xcode 扩展 Reality Composer Pro 3 的功能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • Apple 智能
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • Mini Apps Partner Program
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    阅读最近新闻。
    获取 Apple Developer App。
    版权所有 © 2026 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则