这是一个常见问题,我向您保证,我首先完成了研究。我根本无法获得游戏对象上所有脚本类型实例的列表。
我尝试制作类型数组并将内容循环到列表中。这给了我转换错误。
我尝试使用.AddRange将数组直接添加到列表中。转换错误。
我尝试了不同的GetComponents格式,并将数组的输出转换为我能想到的每种适用类型,但没有成功。
我还尝试过先感染列表,然后在开始时运行GetComponent。
我尝试将CharEquipGenre用作单行为和非单行为。
我在做什么错了?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class CharEquipment : MonoBehaviour
{
public List<CharEquipGenre> equipment_genres = GetComponents <CharEquipGenre>(); // I am trying to do something like this
public CharEquipGenre attack;
public CharEquipGenre defend;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharEquipGenre
{
public List<BlockScriptableObject> equipped = new List<BlockScriptableObject>();
}
//通过请求提供的附加代码:
public class CharEquipment : MonoBehaviour
{
void Start()
{
equipment_genres = GetComponents<CharEquipGenre>();
}
public List<CharEquipGenre> equipment_genres = new System.Collections.Generic.List<CharEquipGenre>();
public CharEquipGenre attack;
public CharEquipGenre defend;
答案 0 :(得分:3)
好吧,CharEquipGenre
不是MonoBehaviour,因此此类没有“组件”。
您可以使用GetComponents
(了解更多here)找到特定类型的所有组件,但这必须是附加到GameObject上的MonoBehaviour
答案 1 :(得分:1)
我不知道unity3d
,但似乎您在定义equipment_genres
时似乎正在尝试对其进行初始化,因此编译器将需要访问编译时可用的内容。
如果GetComponents
是类中的方法,则该方法不是静态的,因此将不起作用。您可以通过使用方法或表达式主体来使用实例:
public List<CharEquipGenre> equipment_genres => new List<CharEquipGenre>(GetComponents<CharEquipGenre>());
虽然稍微“更好”的设计会暴露IEnumerable
:
public IEnumerable<CharEquipGenre> EquipmentGenres => ...
// or
public IEnumerable<CharEquipGenre> GetEquipmentGenres() => ...
答案 2 :(得分:0)
首先创建您的课程[Serializable]
,以便您可以在检查器中看到它并保存它。
[Serializable]
public class CharEquipGenre
{
public List<BlockScriptableObject> equipped = new List<BlockScriptableObject>();
}
然后只需实例化一个新列表,如
public List<CharEquipGenre> equipment_genres = new List<CharEquipGenre>();
请注意,稍后您在检查器中对它们进行的任何操作都将否决这两个条件。添加元素后,对初始化行的任何更改都是无用的(除非您在Reset
的上下文菜单中单击MonoBehaviour
)