【问题标题】:Save prefabs to array将预制件保存到数组
【发布时间】:2015-03-28 12:05:43
【问题描述】:

在我的游戏中,玩家应该能够从菜单中选择单位,这些单位将在以后用于(放置)各种场景中。

为此,我想通过代码将单元预制件保存在静态数组中。
然后我想访问这些预制件,以显示它们在附加脚本中声明的一些变量(如名称、电源和缩略图纹理)以显示在 UI 上。稍后,我想将它们实例化到场景中。

到目前为止,我未能将这些预制件保存到阵列中。

我的代码:

//save to array
if (GUI.Button(Rect(h_center-30,v_center-30,50,50), "Ship A")){
    arr.Push (Resources.Load("Custom/Prefabs/Ship_Fighter") as GameObject);
}

//display on UI
GUI.Label (Rect (10, 10, 80, 20), arr[i].name.ToString());

从最后一行,我得到这个错误:

<i>" 'name' is not a member of 'Object'. "</i>

那么,我的错误在哪里?我是否忘记了什么或声明错误,或者我的方法一开始就无效(即无法以这种方式保存/访问预制件;另一种类型的列表更适合此任务)。

【问题讨论】:

    标签: arrays unity3d unityscript gameobject


    【解决方案1】:

    您声明了没有类型的数组。您可以将数组声明为GameObjects 的列表,也可以在提取元素时强制转换。

    类型转换示例:

    GUI.Label (Rect (10, 10, 80, 20), ((GameObject)arr[i]).name.ToString());    
    
    // which is equivalent to
    GameObject elem = (GameObject)arr[i];
    GUI.Label (Rect (10, 10, 80, 20), elem.name.ToString());
    

    使用通用列表的示例:

    // Add this line at the top of your file for using Generic Lists
    using System.Collections.Generic;
    
    // Declare the list (you cannot add new elements to an array, so better use a List)
    static List<GameObject> list = new List<GameObject>();
    
    // In your method, add elements to the list and access them by looping the array
    foreach (GameObject elem in list) {
        GUI.Label (Rect (10, 10, 80, 20), elem.name.ToString());
    }
    
    // ... or accessing by index
    GameObject[] arr = list.ToArray;
    GUI.Label (Rect (10, 10, 80, 20), arr[0].name.ToString());
    

    【讨论】:

    • 首先,感谢您的快速回复。其次:我使用的是 UnityJS,而不是 c#。因此,我使用了 JS Array,它没有声明类型(我没有成功地寻找一种定义类型的方法)。
      所以为了获得定义的类型,我切换到一个通用列表,它至少不会产生编辑器中的错误。
      但是,当我运行场景并按下按钮时,添加到列表中的游戏对象为空,导致脚本尝试访问其名称时出错。
      显然,我将预制件保存到列表中的方式不起作用。我哪里错了?
    • @user3802640 c# 标签让我很困惑。无论如何,错误是因为您试图访问 Object 类的 name 属性(没有该属性)。将数组元素转换为 GameObject 应该可以解决您的问题。
    • 我现在做什么:插入 arr.Add (Resources.Load("Custom/Prefabs/Ship_Fighter.prefab") as GameObject); 阅读: GUI.Label (Rect (10, 10, 80, 20), (arr[i] as GameObject).name.ToString()); 尽管如此,创建的游戏对象仍然是空的,我得到这个错误:“对象引用未设置为对象的实例” 但是,当我将预制件拖到检查器中的空游戏对象上时,名称会按预期显示。我想我让统一读取预制件的方式有问题。
    • @user3802640 这是一个不同的错误,在您遇到 compiler 错误之前,现在您会遇到 runtime 错误,因为您要添加的对象到数组是null。这通常意味着对象未正确加载。通过首先将预制件保存到变量中来检查是否已加载预制件。请记住,您还可以在 Unity 中使用逐步调试来检查变量内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2015-05-30
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多