C# 从组件列表中动态添加组件

C# 从组件列表中动态添加组件,c#,unity3d,C#,Unity3d,我将对其进行分解以给出理解 我有一个父类项 我为每种类型的物品(武器,盔甲等)开设了儿童课程 我有所有项目的清单 我试图从列表中随机获取一个项目,然后将其添加为一个组件。 我的每个项目都随机生成它们自己的名称、统计信息等,但它们都特定于它们所属的项目类型,因此我需要在它们自己的类中生成它们,而不仅仅是生成“项目” 这就是我到目前为止的情况 public Item RandomList(List<Item> list) { return list[random.

我将对其进行分解以给出理解

我有一个父类

我为每种类型的物品武器盔甲等)开设了儿童课程

我有所有项目的清单

我试图从列表中随机获取一个项目,然后将其添加为一个组件。 我的每个项目都随机生成它们自己的名称、统计信息等,但它们都特定于它们所属的项目类型,因此我需要在它们自己的类中生成它们,而不仅仅是生成“项目”

这就是我到目前为止的情况

public Item RandomList(List<Item> list)
    {
        return list[random.Next(list.Count)];
    }
公共项目列表(列表)
{
返回列表[随机下一步(列表计数)];
}
这将从我的列表中返回一个随机项

public void GenerateLoot(GameObject gameObject, List<Item> list)
    {
        gameObject.AddComponent(randomManager.RandomList(list));
    }
public void GenerateLoot(游戏对象游戏对象列表)
{
gameObject.AddComponent(randomManager.RandomList(list));
}
这就是我遇到问题的地方。它说:“无法从项转换为系统类型”。我试过各种方法,比如使用typeof等


这是我刚刚接触过的东西。

您正在尝试设置
项目类型的
游戏对象组件。如果您尝试在任何
游戏对象
检查器
中添加组件
项,则没有组件(除非您的脚本名为Item,但这不会执行您尝试执行的操作)

我假设在您的示例中,您可能希望在打开箱子时生成一个随机项目。创建一个功能齐全的项目需要几个步骤,所以我不能完全告诉你,所以我会告诉你怎么做

下面将通过添加组件
SpriteRenderer
随机更改
游戏对象的图像,并随机更改此
组件的
Sprite

public class RandomSpawn : MonoBehaviour {

    GameObject gameObject;
    public Sprite[] weapons; // assign an array of weapon sprites in Inspector

    void Start() {
        gameObject = new GameObject();
        SpriteRenderer gameObjectSR = // add SpriteRenderer component
            gameObject.AddComponent(typeof(SpriteRenderer)) as SpriteRenderer;

        int randomIndex = Random.Range(0, weapons.Length); // random index within weapons
        gameObjectSR.sprite = weapons[randomIndex]; // assign Sprite from weapons

        // instantiate object
        Instantiate(gameObject, transform.position, transform.rotation); 
    }
}
因此,您可以从
Sprite[]武器开始,这是一组武器图像(基本上)。在
Start()
函数中,创建一个新的
GameObject
,并添加一个
spriteender
(这不一定是随机的,因为您想更改项目的外观)。随机部分从获取随机
int
(位于武器长度内的索引)开始。然后将一个随机武器
精灵
分配到
游戏对象
,并实例化它。与您的尝试相比,这是可行的,因为
SpriteRenderer
是一个统一的
GameObject组件

public class RandomSpawn : MonoBehaviour {

    GameObject gameObject;
    public Sprite[] weapons; // assign an array of weapon sprites in Inspector

    void Start() {
        gameObject = new GameObject();
        SpriteRenderer gameObjectSR = // add SpriteRenderer component
            gameObject.AddComponent(typeof(SpriteRenderer)) as SpriteRenderer;

        int randomIndex = Random.Range(0, weapons.Length); // random index within weapons
        gameObjectSR.sprite = weapons[randomIndex]; // assign Sprite from weapons

        // instantiate object
        Instantiate(gameObject, transform.position, transform.rotation); 
    }
}
对于这个
游戏对象
,你可能需要附加你的武器脚本(因为它是从物品类派生的),并假设你有武器功能
设置伤害
,如下所示:

Weapon w = gameObject.AddComponent<Weapon>();
w.SetDamage(Random.Range(5,10)); // set weapon damage between 5 and 10
武器w=gameObject.AddComponent(); w、 设置伤害(随机范围(5,10));//将武器伤害设置在5到10之间
这将改变武器伤害的值,例如,当你伤害敌人时,脚本可以访问该值


注意:如果普通的组件库不能满足您的需要,可能有一种方法可以创建您自己的组件。

您正在尝试设置
项目类型的
游戏对象组件。如果您尝试在任何
游戏对象
检查器
中添加组件
项,则没有组件(除非您的脚本名为Item,但这不会执行您尝试执行的操作)

我假设在您的示例中,您可能希望在打开箱子时生成一个随机项目。创建一个功能齐全的项目需要几个步骤,所以我不能完全告诉你,所以我会告诉你怎么做

下面将通过添加组件
SpriteRenderer
随机更改
游戏对象的图像,并随机更改此
组件的
Sprite

public class RandomSpawn : MonoBehaviour {

    GameObject gameObject;
    public Sprite[] weapons; // assign an array of weapon sprites in Inspector

    void Start() {
        gameObject = new GameObject();
        SpriteRenderer gameObjectSR = // add SpriteRenderer component
            gameObject.AddComponent(typeof(SpriteRenderer)) as SpriteRenderer;

        int randomIndex = Random.Range(0, weapons.Length); // random index within weapons
        gameObjectSR.sprite = weapons[randomIndex]; // assign Sprite from weapons

        // instantiate object
        Instantiate(gameObject, transform.position, transform.rotation); 
    }
}
因此,您可以从
Sprite[]武器开始,这是一组武器图像(基本上)。在
Start()
函数中,创建一个新的
GameObject
,并添加一个
spriteender
(这不一定是随机的,因为您想更改项目的外观)。随机部分从获取随机
int
(位于武器长度内的索引)开始。然后将一个随机武器
精灵
分配到
游戏对象
,并实例化它。与您的尝试相比,这是可行的,因为
SpriteRenderer
是一个统一的
GameObject组件

public class RandomSpawn : MonoBehaviour {

    GameObject gameObject;
    public Sprite[] weapons; // assign an array of weapon sprites in Inspector

    void Start() {
        gameObject = new GameObject();
        SpriteRenderer gameObjectSR = // add SpriteRenderer component
            gameObject.AddComponent(typeof(SpriteRenderer)) as SpriteRenderer;

        int randomIndex = Random.Range(0, weapons.Length); // random index within weapons
        gameObjectSR.sprite = weapons[randomIndex]; // assign Sprite from weapons

        // instantiate object
        Instantiate(gameObject, transform.position, transform.rotation); 
    }
}
对于这个
游戏对象
,你可能需要附加你的武器脚本(因为它是从物品类派生的),并假设你有武器功能
设置伤害
,如下所示:

Weapon w = gameObject.AddComponent<Weapon>();
w.SetDamage(Random.Range(5,10)); // set weapon damage between 5 and 10
武器w=gameObject.AddComponent(); w、 设置伤害(随机范围(5,10));//将武器伤害设置在5到10之间
这将改变武器伤害的值,例如,当你伤害敌人时,脚本可以访问该值


注意:如果普通的组件库不能满足您的需要,可能有一种方法可以创建您自己的组件。

正如MSL所说,您需要为它提供一个AddComponent类型参数,如文档所示:

所以我的建议是这样做:

1.首先调用并添加组件(与您的操作类似)

或者我喜欢的方式:

gameObject.AddComponent<Item>();
gameObject.AddComponent();
2。然后添加项目值和属性:

gameObject.GetComponent<Item>().value = item.value;
gameObject.GetComponent().value=item.value;

正如MSL所说,您需要给它一个AddComponent类型参数,正如文档所建议的:

所以我的建议是这样做:

1.首先调用并添加组件(与您的操作类似)

或者我喜欢的方式:

gameObject.AddComponent<Item>();
gameObject.AddComponent();
2。然后添加项目值和属性:

gameObject.GetComponent<Item>().value = item.value;
gam