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