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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:51:44