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

时间:2018-12-02 10:40:06

标签: c# unity3d

在我的2D游戏中,我有一个gameObject作为子画面,然后在另一个脚本中,我在子画面数组中有一个2d纹理数组。我简单地想更改sprite的sprite属性,但得到错误“对象引用未设置为对象的实例”。 这是引发错误的行,它在一个脚本中。

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

虽然数组位于不同的脚本中,但与我尝试从中访问对象的场景(不确定是否会引起问题)在不同的场景中附加到对象“ UIM”,其定义为:

public Sprite[] spriteImages = new Sprite[5];

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

2 个答案:

答案 0 :(得分:1)

您正在尝试从另一个场景访问脚本和变​​量。每次加载新场景时,统一时,旧场景值将被破坏,并导致“对象引用未设置为对象实例”错误。您可以通过调用DontDestroyOnLoad来使告诉团结者不要破坏将来场景中所需的物体。这将允许游戏对象在整个场景中持续存在。 您还需要记住的另一件事是,如果您要返回旧场景,在该场景中将对象UIManager标记为dontdestroyonload,请确保从场景中删除并管理下一个实例,然后重新加载场景,否则无论何时继续加载该场景,使用UImanager的旧场景,它将继续在整个场景中堆积其实例。与dontdestroyonload结合使用的示例应该足以解决您的问题。这是Unity API中显示的摘录,您可以参考:

override fun onConnected(p0: Bundle?) {
    if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    {
        return;
    }
//some code 
}

答案 1 :(得分:0)

您可以尝试:

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;
    }
}