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
相关产品推荐
相关产品推荐

