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

时间:2018-11-17 04:46:10

标签: c# unity3d

我将分解它以提供理解。

我有一个父类项目

每种类型的物品武器装甲等)都有子类。

我有所有物品的清单。

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

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

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等。

这是我的新手。

3 个答案:

答案 0 :(得分:1)

您正在尝试设置类型GameObject Component的{​​{1}}。如果您尝试在任何Item的{​​{1}}中的Add Component项中,则没有任何项(除非您的脚本称为Item,但这不会做您想做的事情)

在您的示例中,我假设您可能想在打开箱子时生成随机物品。创建一个功能齐全的商品需要几个步骤,因此我无法真正将其全部提供给您,因此我将为您提供一个如何做的想法。

以下将通过添加组件Inspector来随机更改GameObject的图像,并随机更改此GameObject的{​​{1}}值。

SpriteRenderer

因此,您从Sprite开始,这是一系列武器图像(基本上)。在Component函数中,创建一个新的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[] weapons(这不必是随机的,因为您想更改项目的外观)。随机部分开始于获得随机Start()(位于武器长度内的索引)。然后将随机武器GameObject分配到SpriteRenderer上,并将其实例化。与您的尝试相比,此方法行之有效,因为int是Unity Sprite

对于此GameObject,您可能需要附加武器脚本(因为它是从Item类派生的),并假设您具有武器功能SpriteRenderer,如下所示:

GameObject Component

然后,这将更改武器伤害的值,例如,当您伤害敌人时,可以通过脚本访问该值。

注意:如果常规的组件库不能满足您的需求,则可能有一种创建自己的组件的方法。

答案 1 :(得分:1)

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

https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html

所以我的建议是这样做:

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

gameObject.AddComponent(typeof(Item)) as Item;

或我偏爱的方式:

gameObject.AddComponent<Item>();

2。然后添加项目的值和属性:

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

答案 2 :(得分:1)

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)。