在对象上创建<T>类的列表

时间:2019-07-11 12:05:47

标签: c# unity3d

这是一个常见问题,我向您保证,我首先完成了研究。我根本无法获得游戏对象上所有脚本类型实例的列表。

我尝试制作类型数组并将内容循环到列表中。这给了我转换错误。

我尝试使用.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;

3 个答案:

答案 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