为什么 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 纹理?
感谢您的耐心和帮助。
首先,如果您打算只更改 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