在我的2D游戏中,我有一个gameObject作为子画面,然后在另一个脚本中,我在子画面数组中有一个2d纹理数组。我简单地想更改sprite的sprite属性,但得到错误“对象引用未设置为对象的实例”。 这是引发错误的行,它在一个脚本中。
this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIM").GetComponent<Manager> ().spriteImages [1];
虽然数组位于不同的脚本中,但与我尝试从中访问对象的场景(不确定是否会引起问题)在不同的场景中附加到对象“ UIM”,其定义为:>
public Sprite[] spriteImages = new Sprite[5];
为什么会出现此错误?我已经用纹理填充了数组,所以看不到问题。
答案 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;
}
}