首页 > 解决方案 > 从组件列表中动态添加组件

问题描述

我将其分解以提供理解。

我有一个父类Item

我为每种类型的项目武器盔甲等)都有子类。

我有所有物品的清单。

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

这就是我到目前为止所拥有的。

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));
    }

这是我遇到问题的地方。它说:“无法从 Item 转换为 System.Type”。我尝试了各种方法,例如使用 typeof 等。

这是我相当新的东西。

标签: c#unity3d

解决方案


AddComponent似乎不支持脚本类型以外的参数,如果我理解正确,您的项目在许多方面都是可定制的,当您在运行时添加组件时应该应用这些方面。我建议AddToGameobject在类中添加方法Item

abstract class Item : Monobehaviour {
    public abstract void AddToGameObject (GameObject obj);
}

class Weapon : Item {
    int damage;
    int cooldown;
    public override void AddToGameObject (GameObject obj) {
        var copy      = obj.AddComponent <Weapon> ();
        copy.damage   = damage;
        copy.cooldown = cooldown;
    }
}

class Armor : Item {
    int protection;
    public override void AddToGameObject (GameObject obj) {
        var copy        = obj.AddComponent <Armor> ();
        copy.protection = protection;
    }
}

你的战利品生成功能将变为

public void GenerateLoot (GameObject gameObject, List <Item> list) {
    randomManager.RandomList (list).AddToGameObject (gameObject);
}

如果您想附加现有组件本身而不是副本,则不能(解释:12)。


推荐阅读