构建、调试和优化 visionOS 的 RealityKit 场景,包括实体/组件设置、渲染、动画、物理、音频、输入、附件等功能。
RealityKit visionOS 开发者.是一项面向实际任务的技能,主要用于Description and Goals. 该技能为在VisionOS上执行RealityKit 空间体验提供了全面的指导.;RealityKit 使用实体Compo.。
实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;
涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
本技能提供在 visionOS 上构建基于 RealityKit 的空间体验的完整指导。RealityKit 采用实体-组件-系统(ECS)架构:实体是轻量级容器,行为由组件定义,而系统负责每帧更新逻辑。
RealityView 与 SwiftUI 正确集成在 visionOS 上实现 RealityKit 功能时,本技能应做到:
System 以实现持续性行为ARView,或阻塞主 Actor请根据下方表格,加载对应组件或系统的参考文档,获取详细用法、代码示例与最佳实践。
Component 并遵循 Codable 协议。Component.registerComponent() 全局注册一次自定义组件。RealityView 闭包、事件处理器及系统)对实体进行修改。RealityView 实现 SwiftUI 与 RealityKit 的桥接。Entity(named:) 或 Entity(contentsOf:) 异步加载资源,并妥善处理错误。RealityView 的 attachments 闭包;若更倾向于以组件方式管理附件,则应使用 ViewAttachmentComponent。System。EntityQuery 配合 QueryPredicate 查询实体,并在 update(context:) 中进行处理。SystemDependency 控制系统更新顺序。请参考下表,在实现 RealityKit 功能时选择需加载的组件参考文档:
| 组件 | 适用场景 |
|---|---|
ModelComponent |
为实体渲染包含网格与材质的 3D 几何体时。 |
ModelSortGroupComponent |
出现深度冲突(z-fighting)问题(如重叠几何体),或需控制绘制顺序时。 |
OpacityComponent |
实现淡入/淡出效果、使实体呈半透明状态,或实现可见性过渡动画时。 |
AdaptiveResolutionComponent |
在大型场景中通过降低远距离对象的渲染质量来优化性能时。 |
ModelDebugOptionsComponent |
调试渲染问题、可视化模型几何结构,或在开发过程中检查包围盒时。 |
MeshInstancesComponent |
需高效渲染大量相同网格实例(如树木、人群、类粒子对象)时。 |
BlendShapeWeightsComponent |
实现面部动画、角色表情或网格形变(morphing)时。 |
| 组件 | 适用场景 |
|---|---|
InputTargetComponent |
使实体具备交互能力(如可点击、可拖拽)或处理用户输入事件时。 |
ManipulationComponent |
借助手势或触控板实现内置的拖拽、旋转与缩放交互时。 |
GestureComponent |
需实现 ManipulationComponent 未覆盖的自定义手势识别时。 |
HoverEffectComponent |
为可交互实体提供视觉反馈(如用户注视或悬停时)时。 |
AccessibilityComponent |
使实体兼容屏幕阅读器、VoiceOver 或其他辅助技术时。 |
BillboardComponent |
创建始终面向观察者的 2D 精灵、文本标签或 UI 元素时。 |
| 组件 | 适用场景 |
|---|---|
AnchoringComponent |
将虚拟内容锚定至检测到的平面、追踪图像、手部位置或世界目标时。 |
ARKitAnchorComponent |
访问已锚定实体对应的底层 ARKit 锚点数据时。 |
SceneUnderstandingComponent |
访问场景理解数据(如检测到的对象或房间重建结果)时。 |
DockingRegionComponent |
定义内容可自动停靠或吸附的区域时。 |
ReferenceComponent |
实现外部实体资源的延迟加载,或引用其他文件中的实体时。 |
AttachedTransformComponent |
将一个实体的变换(transform)挂载至另一实体,以实现层级化定位时。 |
| 组件 | 适用场景 |
|---|---|
PerspectiveCameraComponent |
为 3D 场景配置带深度与视野(FOV)的透视摄像机时。 |
OrthographicCameraComponent |
为类 2D 视图配置无透视失真的正交摄像机时。 |
ProjectiveTransformCameraComponent |
需实现自定义投影变换以满足特殊渲染需求时。 |
| 组件 | 适用场景 |
|---|---|
PointLightComponent |
添加从某一点向所有方向辐射的全向点光源时。 |
DirectionalLightComponent |
添加具有平行光线的方向光(如模拟日光),实现统一场景照明时。 |
SpotLightComponent |
添加锥形聚光灯,实现聚焦且具方向性的照明效果时。 |
ImageBasedLightComponent |
应用 HDR 纹理提供的环境光照,以实现真实反射与环境光效果时。 |
ImageBasedLightReceiverComponent |
启用实体接收并响应场景中基于图像的光照时。 |
GroundingShadowComponent |
为悬浮内容添加着地阴影,使其在视觉上锚定于表面时。 |
DynamicLightShadowComponent |
启用由光源实时投射至实体上的动态阴影时。 |
EnvironmentLightingConfigurationComponent |
配置环境光照的行为、强度或混合模式时。 |
VirtualEnvironmentProbeComponent |
实现反射探针(reflection probe),以在虚拟环境中获得精确反射效果时。 |
| 组件 | 适用场景 |
|---|---|
SpatialAudioComponent |
播放随听者位置与朝向变化的 3D 定位音频时。 |
AmbientAudioComponent |
播放不随听者位置变化的非定向环境音时。 |
ChannelAudioComponent |
播放通道音频(如立体声、环绕声等)且无需空间化处理时。 |
AudioLibraryComponent |
集中存储与管理多个音频资源,供不同实体复用时。 |
ReverbComponent |
为实体音频添加混响效果,以实现空间声学模拟时。 |
AudioMixGroupsComponent |
将多个音频源分组,以便集中控制混音与音量管理时。 |
| 组件 | 适用场景 |
|---|---|
AnimationLibraryComponent |
在单个实体上存储多个动画(如待机、行走、奔跑),用于角色动画时。 |
CharacterControllerComponent |
实现具备物理特性、碰撞检测与地面判定的角色移动时。 |
CharacterControllerStateComponent |
为角色控制器存储运行时状态(如速度、是否着地)时。 |
SkeletalPosesComponent |
提供骨骼姿态数据,用于骨骼动画与骨骼变换时。 |
IKComponent |
实现逆向运动学(IK),用于过程化动画(如伸手、指向)时。 |
BodyTrackingComponent |
集成 ARKit 身体追踪数据,依据真实世界身体姿态驱动实体动画时。 |
| 组件 | 适用场景 |
|---|---|
CollisionComponent |
定义碰撞形状,用于命中测试、射线检测或物理交互时。 |
PhysicsBodyComponent |
为实体添加物理属性(如质量、重力、受力)以参与物理模拟时。 |
PhysicsMotionComponent |
以编程方式控制物理刚体的线速度与角速度时。 |
PhysicsSimulationComponent |
配置全局物理模拟参数(如重力、时间步长)时。 |
ParticleEmitterComponent |
从实体位置发射粒子效果(如烟雾、火花、碎片)时。 |
ForceEffectComponent |
施加影响多个物理刚体的力场(如引力井、爆炸冲击)时。 |
PhysicsJointsComponent |
在物理刚体之间创建关节(如铰链、弹簧),构建可活动结构时。 |
GeometricPinsComponent |
定义几何连接点,用于在指定位置连接多个实体时。 |
| 组件 | 适用场景 |
|---|---|
PortalComponent |
创建传送门,在开口处渲染独立世界或场景时。 |
WorldComponent |
将实体层级标记为独立可渲染世界,专用于传送门渲染时。 |
PortalCrossingComponent |
控制实体穿越传送门边界时的行为(如瞬移、场景切换)时。 |
EnvironmentBlendingComponent |
混合虚拟内容与真实环境,以实现混合现实体验时。 |
| 组件 | 适用场景 |
|---|---|
ViewAttachmentComponent |
将 SwiftUI 视图嵌入 3D 空间,用于交互式 UI 元素或标签时。 |
PresentationComponent |
通过实体交互触发 SwiftUI 模态框、抽屉页(sheet)或系统级 UI 时。 |
TextComponent |
直接在实体上渲染 3D 文本(不依赖 SwiftUI 视图)时。 |
ImagePresentationComponent |
在 3D 空间中于实体表面显示图像或纹理时。 |
VideoPlayerComponent |
使用 AVPlayer 在实体表面播放视频内容时。 |
| 组件 | 适用场景 |
|---|---|
SynchronizationComponent |
在联网多人会话中同步实体状态、变换(transform)及组件数据时。 |
TransientComponent |
将实体标记为临时、非持久化对象,并排除其参与网络同步时。 |
在实现自定义 ECS 行为时,请参考以下内容:
| 系统 / API | 适用场景 |
|---|---|
System and Component Creation |
创建自定义系统以实现持续性、逐帧更新行为,或创建自定义组件以维护实体级状态时。 |
RealityView { content in
do {
let entity = try await Entity(named: "Scene")
content.add(entity)
} catch {
print("Failed to load entity: \(error)")
}
}
let entity = ModelEntity(mesh: .generateBox(size: 0.1)) entity.components.set(CollisionComponent(shapes: [.generateBox(size: [0.1, 0.1, 0.1])])) entity.components.set(InputTargetComponent()) entity.components.set(ManipulationComponent())
import RealityKit
struct SpinComponent: Component, Codable {
var speed: Float
}
struct SpinSystem: System {
static let query = EntityQuery(where: .has(SpinComponent.self))
init(scene: Scene) {}
func update(context: SceneUpdateContext) {
for entity in context.entities(matching: Self.query, updatingSystemWhen: .rendering) {
guard let spin = entity.components[SpinComponent.self] else { continue }
entity.transform.rotation *= simd_quatf(angle: spin.speed * Float(context.deltaTime), axis: [0, 1, 0])
}
}
}
SpinSystem.registerSystem()
ARView;请改用 RealityView。CollisionComponent 与 InputTargetComponent。RealityView 的 update 闭包;而对于跨多个实体的持续性逐帧行为,请优先采用自定义 System。MeshResource API 创建的文本与自定义网格内容。相关专题
热门下载
相关下载
精品课程
共6课时 | 54.6万人学习
共89课时 | 133.4万人学习
共49课时 | 82.2万人学习