You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

visionOS中加载完成后如何以编程方式访问、隐藏和修改场景内容

在visionOS中编程访问、修改已加载的场景内容

针对Model3D的方案

Model3D是SwiftUI封装的视图,要在加载完成后访问内容,可通过onModel3DChange回调结合状态变量保存实体引用:

  • 定义状态变量存储加载后的实体:@State private var loadedModel: ModelEntity?
  • 在Model3D中绑定回调,保存实体:
Model3D(named: "MyScene") { phase in
    switch phase {
    case .empty: ProgressView()
    case .success(let model): model
    case .failure(let error): Text("加载失败: \(error.localizedDescription)")
    }
}
.onModel3DChange { newModel in
    loadedModel = newModel as? ModelEntity
}
  • 后续即可通过loadedModel直接操作:比如隐藏实体loadedModel?.isEnabled = false,修改缩放loadedModel?.transform.scale = .init(x: 2, y: 2, z: 2),替换材质loadedModel?.model?.materials = [PhysicallyBasedMaterial()]。

针对RealityView的方案

RealityView提供更直接的RealityKit场景控制权,有两种常见方式访问已加载内容:

  1. 加载时保存实体引用
    在content闭包中加载模型后,直接把目标实体(或子实体)存入状态变量:
@State private var targetEntity: Entity?

RealityView { content in
    guard let model = try? await Entity(named: "MyScene") else { return }
    content.add(model)
    // 查找并保存子实体
    targetEntity = model.find(named: "ButtonEntity")
}
  1. 利用update闭包动态修改
    RealityView的update闭包会在状态变化时触发,可在这里根据业务逻辑修改实体:
@State private var isEntityHidden = false

RealityView { content in
    let model = try! await Entity(named: "MyScene")
    content.add(model)
} update: { content in
    // 通过名称查找实体并修改
    if let entity = content.entities.first?.find(named: "Target") {
        entity.isEnabled = !isEntityHidden
        entity.transform.rotation = .init(angle: .degrees(45), axis: .x)
    }
}

通用技巧

  • 给场景中的实体设置唯一name属性,方便通过find(named:)快速定位;
  • 遍历实体的children属性,可批量访问子实体;
  • 对于复杂场景,可利用EntityHierarchyObserver监听实体层级变化,确保在实体加载完成后再执行操作。

内容的提问来源于stack exchange,提问作者czane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:00:08