我正在研究一种可以让玩家自定义精灵的方法。我在经理脚本中创建了一个数组,如下所示:
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'游戏对象与我使用查找源的对象不在同一场景中。这是无效的吗?
答案 0 :(得分:1)
spriteImages
变量未声明为static
,这意味着您需要一个UIManager实例来访问其中的spriteImages
变量。您可以将其标记为静态,而无需提供实例来访问它。
public static Sprite[] spriteImages = new Sprite[5];
这是修复该错误的一种方法,但我认为您不应该使用static
。 UIManager
可能是附加到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:
您可以找到带有名称的单个游戏对象,否则将返回第一个
名称的对象。 GameObject.Find(string name)
这将返回带有特定标签的游戏对象。你可能
如果您不想使用tag来设置游戏对象
知道如何设置。
GameObject.FindGameObjectsWithTag(string tag)
这将返回带有标签的第一个游戏对象。
GameObject FindWithTag(string tag)
此API返回所需类型的第一个游戏对象。
GameObject.FindObjectOfType(Type type)
此API将返回所有具有给定类型的游戏物体。
案例类型可以是Class类型。这将返回所有
附带您的类类型的游戏objcts。
GameObject.FindObjectsOfType(Type type)
4)将数组设置为静态,但是如果这样做,您将无法在统一编辑器中访问它,因此将无法在编辑器中分配Sprites。
对于您的问题,我认为第一种方法不仅仅可以解决问题。