C# Unity-在循环中动态设置UI按钮的精灵

C# Unity-在循环中动态设置UI按钮的精灵,c#,unity3d,C#,Unity3d,我正在Unity 4.7项目中工作,在我的场景中有15个UI按钮(名为Button1,Button2,…),希望动态设置精灵或纹理。我在下一条路上做到了: public Button[] buttonsFlags = new Button[15]; 公共类TextureLoader { 公共精灵[]纹理; 公共void LoadTextures(字符串编号) { string path=“Flags/page”+pgNumber; 纹理=Resources.LoadAll(路径); } }

我正在Unity 4.7项目中工作,在我的场景中有15个UI按钮(名为Button1,Button2,…),希望动态设置精灵或纹理。我在下一条路上做到了:

public Button[] buttonsFlags = new Button[15];

公共类TextureLoader
{
公共精灵[]纹理;
公共void LoadTextures(字符串编号)
{
string path=“Flags/page”+pgNumber;
纹理=Resources.LoadAll(路径);
}
}
公共无效填充标签页(字符串编号)
{
textureLoader.LoadTextures(pgNumber);

对于(int i=1;i,该错误意味着您试图访问
null
引用,即:未初始化的对象,或者应该返回对象的某个函数/属性调用实际返回
null

鉴于产生错误的行,可能的候选行包括:

  • GameObject.Find(btnName)
    返回一个
    null
    ,因此下一次调用
    .GetComponent()
    失败。检查按钮GameObject是否实际在场景中

  • 按钮标记数组
    未初始化,尝试为未初始化的数组赋值失败。但是,这不太可能,因为您实际上是在初始化数组,但可能是在初始化数组之前调用
    FillOffFlagsPage

顺便说一句,您正在迭代从1开始的纹理数组,而不是应该的0。更改该数组(并使用
(i+1).ToString()
获取按钮的名称),否则您将无法设置最后一个按钮的纹理(并将所有按钮的纹理移动一个)

for(int i=0;i

用这个新的for循环代码替换for循环,然后在控制台窗口中检查,以确保在出现错误之前最后打印的按钮名称存在于场景中。可能是按钮名为按钮1按钮2,而不是按钮1按钮2。如果是这种情况然后在按钮后添加空格。
“Button”+(i+1).ToString();

该错误意味着您试图访问
null
引用,即:未初始化的对象,或应返回对象的某个函数/属性调用实际返回
null

鉴于产生错误的行,可能的候选行包括:

  • GameObject.Find(btnName)
    返回一个
    null
    ,因此下一次调用
    .GetComponent()
    失败。检查按钮GameObject是否实际在场景中

  • 按钮标记数组
    未初始化,尝试为未初始化的数组赋值失败。但是,这不太可能,因为您实际上是在初始化数组,但可能是在初始化数组之前调用
    FillOffFlagsPage

顺便说一句,您正在迭代从1开始的纹理数组,而不是应该的0。更改该数组(并使用
(i+1).ToString()
获取按钮的名称),否则您将无法设置最后一个按钮的纹理(并将所有按钮的纹理移动一个)

for(int i=0;i

用这个新的for循环代码替换for循环,然后在控制台窗口中检查,以确保在出现错误之前最后打印的按钮名称存在于场景中。可能是按钮名为按钮1按钮2,而不是按钮1按钮2。如果是这种情况然后在按钮后添加空格。
“Button”+(i+1).ToString();

回答得很好。添加了他的while循环的固定版本+
Debug.Log
,以查看打印的按钮名称是否确实存在于场景中。感谢您的回复。我有Button1,…,Button15(没有空格)在我的场景中,我用断点调试了代码,所以第一个btnName是Button1。在那个异常发生后。调用过程的位置不对,我在激活按钮所在的面板之前就这样做了。回答很好。添加了一个固定版本的while循环+
Debug.Log
,以查看打印的按钮名称是否确实存在于谢谢你的回复。我有按钮1,…,按钮15(没有空格)在我的场景中,我调试了带有断点的代码,因此第一个btnName是Button1。在发生异常之后。调用过程的位置不对,我在激活按钮所在的面板之前就这样做了。如果不输入行号,堆栈跟踪就没有多大帮助;)您有很多问题。您的按钮必须是索引编号(从“0”开始),而不是计数编号(从“1”开始)。其次,我可能会敦促您不要这样做。只需使用非常简单的“统一方式”即可。将这行代码
公共按钮[]fifteenButtons;
在脚本中,只需将按钮拖动到该数组中即可。请注意,您当前所依赖的事实是,您在开发时在编辑器中正确命名了游戏对象。从概念上讲,这比“我必须记住将它们拖动到数组中”更糟糕。如果不输入行号,堆栈跟踪没有多大帮助;)您有很多问题。您的按钮必须是索引编号(从“0”开始),而不是计数编号(从“1”开始)。秒
public class TextureLoader
{
    public Sprite[] textures;
    public void LoadTextures(string pgNumber)
    {
        string path = "Flags/page" + pgNumber;
        textures = Resources.LoadAll<Sprite> (path);
    }
}

public void FillTheFlagsPage(string pgNumber)
    {
        textureLoader.LoadTextures(pgNumber);

        for (int i = 1; i <= textureLoader.textures.Length; i++) 
        {
            string btnName = "Button" + i.ToString ();
            buttonsFlags[i] = GameObject.Find (btnName).GetComponent<Button>();
            //buttonsFlags[i].GetComponent<Renderer>().material.mainTexture = textureLoader.textures[i];
            buttonsFlags[i].image.sprite = textureLoader.textures[i];
        }
    }
for (int i = 0; i < textureLoader.textures.Length; i++)
{
    string btnName = "Button" + (i + 1).ToString();
    Debug.Log(btnName);
    buttonsFlags[i] = GameObject.Find(btnName).GetComponent<Button>();
    //buttonsFlags[i].GetComponent<Renderer>().material.mainTexture = textureLoader.textures[i];
    buttonsFlags[i].image.sprite = textureLoader.textures[i];
}