Unity2D从数组C#

时间:2018-11-30 22:10:13

标签: c# unity3d

我正在研究一种可以让玩家自定义精灵的方法。我在经理脚本中创建了一个数组,如下所示:

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

在此数组中,我打算添加5个png文件,这些文件将用于更新spriteRenderer sprite。我有两个问题,我正在努力用精灵的脚本访问数组(我相信这是更改图像的最佳方法)。我也在努力研究如何更改子画面图像。目前,我正在使用以下代码:

this.gameObject.GetComponent<SpriteRenderer> ().sprite = GameObject.Find ("UIManager").GetComponent<UIManager> ().spriteImages [0];

在我的精灵列表中,我放置了5个png文件(二维精灵纹理),但是当我运行程序时,它说“对象引用未设置为对象的实例”。不知道为什么当数组中包含精灵时会出现此错误?

我所指的'UIManager'游戏对象与我使用查找源的对象不在同一场景中。这是无效的吗?

2 个答案:

答案 0 :(得分:1)

spriteImages变量未声明为static,这意味着您需要一个UIManager实例来访问其中的spriteImages变量。您可以将其标记为静态,而无需提供实例来访问它。

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

这是修复该错误的一种方法,但我认为您不应该使用staticUIManager可能是附加到GameObject的脚本,因此您要做的就是找到UIManager附加的GameObject,然后从中获取UIManager组件。该组件是访问spriteImages变量而不使其成为static所需的脚本实例。

private UIManager uIManager;

void Start()
{
    //Find the GameObject then the script instance
    GameObject uManagerObj = GameObject.Find("UIManager GameObject");
    uIManager = uManagerObj.GetComponent<UIManager>();

    //Now you can do this with the script instance
    this.gameObject.GetComponent<SpriteRenderer>().sprite = uIManager.spriteImages[0];
}

请确保将GameObject.Find函数中的“ UIManager GameObject” 替换为附加了UIManager脚本的GameObject的名称。

答案 1 :(得分:1)

有几种方法可以解决您的问题。

1)Singleton classes。声明类的静态实例,其中将精灵数组保留在其中,即uIManager类。您可以使用link中显示的方法使您的类单身,也可以像这样简单地声明:

public class UIManager : MonoBehaviour {
    UIManager static instance;

    void Start() {
        instance = this;
    }
}

好的一面是,您可以像 UIManager.instance 这样直接引用您的类,并获取该类内部的所有公共变量。不利的一面是,如果您在同一场景中有多个脚本,它将仅引用该实例之一,而您将无法访问场景中存在的脚本的其他实例。因此,此方法只能用于每个场景一个实例。

2)在Unity编辑器中保存所需脚本的引用,并将其分配给脚本中的公共变量。假设您有A类进行一些计算,而B类则存储一些数据;让我们假设它的Sprite数组类似于您的脚本。现在在A类中,您需要该Sprite数组进行分配。因此,您可以做的是声明B类的公共变量,即public ClassB classBInstance;。您将可以在统一编辑器中看到ClassB字段实例为空。您可以直接分配所需的参考,并且可以访问B类的变量。

3)使用unity API查找附加了您的类的游戏对象。 除了上述两种方法外,这些是我经常使用的一些API:

4)将数组设置为静态,但是如果这样做,您将无法在统一编辑器中访问它,因此将无法在编辑器中分配Sprites。

对于您的问题,我认为第一种方法不仅仅可以解决问题。