为什么 Unity3D 不能通过字符串更改简单的 GUITexture

本文关键字:简单 GUITexture 字符串 Unity3D 不能 为什么 | 更新日期: 2023-09-27 18:33:56


我试图从游戏对象更改 GUITexture,但什么也没发生。
它尝试加载纹理 2D,但从 GUITexture 中删除纹理并且不加载新纹理,如下面的代码所示。

public GameObject materialToChange;
public GameObject imageEnviroment;
void OnGUI()
{
    GUI.skin = btGoBack;
    if( GUI.Button(..., "")  )
    {
        if( materialToChange )
        {
            Debug.Log( "Enviroment Name: "+ materialToChange.GetComponent<MeshRenderer>().material.name );
            // This show like this "Enviroment Name: nameOfTextureString (Instance)"
            Texture2D newTexture = Resources.Load<Texture2D>( materialToChange.GetComponent<MeshRenderer>().material.name );
            imageEnviroment.GetComponent<GUITexture>().texture = newTexture;
            Debug.Log("Texture Name is?? "+ newTexture.name );
            // Here i receive this "NullReferenceException: Object reference not set to an instance of an object"
        }
    }
}

我尝试将路径放在纹理所在的位置,并且具有相同的空引用。
有没有办法只改变 GUITexture 纹理?
感谢您的耐心和帮助。

为什么 Unity3D 不能通过字符串更改简单的 GUITexture

首先,如果您打算只更改 GUITexture,那么最好有一个

public UITexture; 

并改为分配此内容。

但回到今天的问题,您正在尝试为纹理指定材质名称。这就解释了为什么你会得到空引用,因为纹理永远不会被分配。所以而不是

materialToChange.GetComponent<MeshRenderer>().material.name

你会想要类似的东西

materialToChange.GetComponent<MeshRenderer>().material.mainTexture.name;

还要确保此纹理位于您的资产/资源(区分大小写)文件夹中,否则 Resources.Load 将不起作用

最大的问题是 UNITY 在 texture.name 的名称中放置了一个"(实例)"字符串。
如果 UNITY 仅将其放在调试中,我们看到这是一个实例。
所以我必须使用这个删除这个字符串:

Debug.Log( "Enviroment Name: "+ materialToChange.GetComponent<MeshRenderer>().material.name.Replace(" (Instance)","") );

然后名字是正确的,现在改变我的质地!
Unity这样做非常烦人和耻辱....但现在它固定了。感谢您的回答 @mx-d