Unity预制体子物体单独上传图片报错求助(附代码)
问题分析与修复方案
嘿,一眼就能看出问题所在啦!你报错的核心原因是**boxCols是一个MeshRenderer[]数组,而不是单个MeshRenderer组件**——数组本身并没有material这个属性,你得遍历数组里的每一个元素,给每个子物体的MeshRenderer单独设置纹理才行。
修正后的完整代码
using UnityEngine; using UnityEditor; using System.IO; public class WallClick : MonoBehaviour { string path; public MeshRenderer col; public MeshRenderer[] boxCols; void OnMouseDown() { boxCols = GetComponentsInChildren<MeshRenderer>(); path = EditorUtility.OpenFilePanel("Overwrite with png", "", "png"); GetImage(); } void EnableChildComponents() { foreach (MeshRenderer col in boxCols) { col.enabled = true; } } void GetImage() { // 换成更严谨的空值+空字符串判断,覆盖用户取消选择的场景 if (!string.IsNullOrEmpty(path)) { UpdateImage(); } } void UpdateImage() { byte[] imgByte = File.ReadAllBytes(path); Texture2D texture = new Texture2D(2, 2); texture.LoadImage(imgByte); // 遍历数组,给每个子物体的MeshRenderer逐一设置纹理 foreach(MeshRenderer renderer in boxCols) { renderer.material.mainTexture = texture; } } }
几个实用优化建议
- 性能优化:如果你的预制体子物体结构不会动态变化,可以把
boxCols = GetComponentsInChildren<MeshRenderer>()移到Awake()或Start()方法里,不用每次点击都重新获取组件,节省不必要的性能开销。 - 纹理显示优化:加载纹理后可以根据需求调整参数,比如设置
texture.wrapMode = TextureWrapMode.Clamp避免纹理重复拉伸,或者调整filterMode优化模糊/锐利度。 - 资源管理:如果频繁加载不同图片,建议考虑缓存已加载的Texture2D对象,避免重复创建销毁造成的性能浪费。
内容的提问来源于stack exchange,提问作者user6411634
相关产品推荐
相关产品推荐

