C# Unity 2D从精灵列表中更改精灵

C# Unity 2D从精灵列表中更改精灵,c#,unity3d,C#,Unity3d,在我的2D游戏中,我有一个游戏对象作为精灵,然后在另一个脚本中,我有一个2D纹理数组,一个精灵数组。我只想更改精灵的精灵属性,但得到错误“对象引用未设置为对象的实例”。 以下是引发错误的行,它位于一个脚本中: this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIM").GetComponent<Manager> ().spriteImages [1]; 为什么我会犯这个

在我的2D游戏中,我有一个游戏对象作为精灵,然后在另一个脚本中,我有一个2D纹理数组,一个精灵数组。我只想更改精灵的精灵属性,但得到错误“对象引用未设置为对象的实例”。 以下是引发错误的行,它位于一个脚本中:

this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIM").GetComponent<Manager> ().spriteImages [1];

为什么我会犯这个错误?我已经用纹理填充了数组,所以看不出问题。

您正在尝试从另一个场景访问脚本和变量。在unity中,无论何时加载新场景,旧场景值都将被破坏,这将导致“对象引用未设置为对象实例”错误。你可以通过打电话告诉大家不要破坏你在未来场景中需要的物体。这将允许游戏对象在整个场景中持续存在。 您必须记住的另一件事是,如果要返回到将对象UIManager标记为dontdestroyonload的旧场景,请确保从重新加载的场景中删除并管理下一个实例,否则每当您继续使用UIManager重新加载旧场景时,它将继续堆积其实例穿过场景。使用dontdestroyonload的unity中的示例应该足以解决您的问题。以下是Unity API中显示的一个片段,您可以参考:

void Awake()
{
    GameObject[] objs = GameObject.FindGameObjectsWithTag("music");

    if (objs.Length > 1)
    {
        Destroy(this.gameObject);
    }

    DontDestroyOnLoad(this.gameObject);
}
您可以尝试:

public GameObject[] objs = 
      SceneManager.GetSceneByName(sceneToLoad).GetRootGameObjects(); 
foreach(GameObject go in objs)
{
    if(go.name == "UIM")
    {
        this.gameObject.GetComponent<SpriteRenderer> ().sprite = 
          go.GetComponent<Manager> ().spriteImages [1];
        break;
    }
}
public GameObject[] objs = 
      SceneManager.GetSceneByName(sceneToLoad).GetRootGameObjects(); 
foreach(GameObject go in objs)
{
    if(go.name == "UIM")
    {
        this.gameObject.GetComponent<SpriteRenderer> ().sprite = 
          go.GetComponent<Manager> ().spriteImages [1];
        break;
    }
}