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

RealityKit中ModelEntity切换UnlitMaterial颜色异常问题求助

RealityKit 模型选中材质切换异常问题解决

问题根源

你当前的材质操作逻辑过于复杂,依赖子节点数量判断选中状态的方式不可靠,且材质数组的交换、移除操作容易导致材质引用混乱,进而出现第二次选中时材质变白的异常。

修复方案

重构选中逻辑,用明确的变量记录选中状态和原始材质,简化材质替换操作:

首先在你的类中添加两个全局变量:

var selectedModel: ModelEntity?
var originalMaterials: [Material]?

然后替换长按手势处理函数:

@objc func handleLongPress(recognizer: UILongPressGestureRecognizer) {
    guard recognizer.state == .began else { return }
    
    let location = recognizer.location(in: arView)
    guard let tappedEntity = arView.entity(at: location),
          let targetModel = tappedEntity.findEntity(named: "model") as? ModelEntity else {
        return
    }
    
    // 点击未选中的模型,切换选中状态
    if selectedModel != targetModel {
        // 先恢复之前选中模型的原始材质
        if let prevModel = selectedModel, let origMats = originalMaterials {
            prevModel.model?.materials = origMats
            objectMenu.isHidden = true
        }
        
        // 保存当前模型的原始材质,替换为橙色高亮材质
        originalMaterials = targetModel.model?.materials
        let highlightMat = UnlitMaterial(color: .orange)
        targetModel.model?.materials = [highlightMat]
        
        selectedModel = targetModel
        objectMenu.isHidden = false
    }
    // 点击已选中的模型,取消选中
    else {
        if let origMats = originalMaterials {
            targetModel.model?.materials = origMats
        }
        selectedModel = nil
        originalMaterials = nil
        objectMenu.isHidden = true
    }
    
    recognizer.state = .cancelled
}

关键改动说明

  • 去掉依赖子节点数量的不可靠判断,改用selectedModel直接记录当前选中的模型
  • 选中时保存原始材质数组,取消时直接恢复,避免复杂的材质数组交换/移除操作
  • 简化材质替换逻辑:单submesh模型直接替换为橙色材质;多submesh场景可改为[highlightMat] + originalMaterials!,保证所有子网格都高亮
  • 用全局变量统一管理选中状态,避免每次操作时重复查找和错误的引用处理

额外优化建议

可以把橙色UnlitMaterial定义为全局常量,避免每次选中时重复创建:

let highlightMaterial = UnlitMaterial(color: .orange)

后续切换时直接使用这个实例即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 20:16:08