Unity如何仅修改单个实例化对象的颜色且不影响预制体及其他实例
Unity单个预制体实例改色问题解决方案
问题核心
你遇到的报错本质是SpawnerController的citizens数组中存储的是预制体资源本身,而非运行时实例化出来的克隆对象。Unity禁止直接修改预制体资源的material属性,因此抛出对应错误。手动拖拽材质可生效是因为操作对象是Hierarchy面板中的运行时实例,而非Project面板中的预制体资源。
第一步:修复实例化存储逻辑
修改SpawnerController中生成对象并存入数组的代码,将原本直接存预制体的逻辑替换为存储Instantiate返回的克隆对象:
// 错误示例:直接将预制体存入数组 // citizens[index] = citizenPrefab; // 正确示例:存储实例化后的运行时克隆对象 GameObject citizenClone = Instantiate(citizenPrefab, spawnPos, spawnRotation); citizens[index] = citizenClone;
完成该修改后,数组中取出的target就是运行时实例,不再是预制体资源,即可正常修改单个对象的材质属性。
第二步:单个实例修改颜色的两种可行方案
- 方案1:直接修改实例材质颜色(适合临时改色场景)
访问Renderer.material时Unity会自动为当前实例生成一份独立的材质副本,修改不会影响其他实例或预制体:
Renderer targetRender = target.GetComponent<Renderer>(); targetRender.material.color = Color.black;
注意:该方法每次调用.material都会生成新的材质副本,频繁调用会产生额外GC,适合少量对象修改的场景。
- 方案2:替换为独立材质资源(适合需要统一管理目标样式的场景)
就是你当前使用的写法,只要target是运行时实例即可正常运行,仅修改单个对象的材质:
Material victimMaterial = Resources.Load<Material>("VictimMaterial"); GameObject target = SpawnerController.sharedInstance.citizens[victim]; MeshRenderer victimRenderer = target.GetComponent<MeshRenderer>(); victimRenderer.material = victimMaterial;
内容的提问来源于stack exchange,提问作者adrian
相关产品推荐
相关产品推荐

