我将分解它以提供理解。
我有一个父类项目。
每种类型的物品(武器,装甲等)都有子类。
我有所有物品的清单。
我正在尝试从该列表中随机抓取一个项目,然后将其添加为组件。 我的每个商品都会随机生成自己的名称,统计信息等,但它们都是特定于其所属商品的类型,因此我需要将它们生成在自己的类中,而不仅仅是生成“商品”。
这就是我到目前为止的情况。
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等。
这是我的新手。
答案 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);
}