随机列表对象并实例化游戏对象
random list object and instantiate gameObject
我将以口袋妖怪为例:我有一个包含 10 个元素的列表,每个元素包含:字符串名称、游戏对象、int hp 和 mana int、int rarity。
我需要在每次点击或点击后随机生成一个,即使这么好,但想象一下这 10 个口袋妖怪,其中 2 个非常稀有。
随机后会查看普通或稀有宝可梦。如果常见,它将成为另一个随机数,并且只会选择 1。如果稀有口袋妖怪,选择两个可用的之一。我相信这很混乱。
这个问题,我没能使随机列表不实例化对象。目前我的代码如下..
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
public class Pokemons : MonoBehaviour
{
[Serializable]
public class ListPokemons
{
public string name;
public GameObject componentObjc;
public int hp;
public int mana;
public int rarity;
}
public ListPokemons[] pokeAtributs;
// Use this for initialization
void Start ()
{
List<ListPokemons> list = pokeAtributs.ToList ();
//ListPokemons pokemon = list.FirstOrDefault (r => r.componentObjc != null);
}
}
我正在使用 Unity 5。我是葡萄牙语,所有文本均已使用 google translate 翻译。
问题是 public ListPokemons[] pokeAtributs;
在您 List<ListPokemons> list = pokeAtributs.ToList ();
之前从未初始化过
只需使用 new
关键字初始化数组即可。
[Serializable]
public class ListPokemons
{
public string name;
public GameObject componentObjc;
public int hp;
public int mana;
public int rarity;
}
public ListPokemons[] pokeAtributs;
// Use this for initialization
void Start ()
{
//You are missing this part in your code (10 pokeAtributs )
pokeAtributs = new pokeAtributs[10];
//Now you can do your stuff
List<ListPokemons> list = pokeAtributs.ToList ();
}
我觉得你应该在两个不同的列表中组织你的稀有和常见。
可能是这样的(这是一个模型):
// fill these in the inspector. you don't need the extra arrays.
public List<ListPokemons> rarePokemon;
public List<ListPokemons> commonPokemon;
...
void PickPokemon()
{
int rarityRoll = Random.Range(0, 100);
if(rarityRoll < 80)
{
// choose something from common
int roll = Random.Range(0, commonPokemon.Count);
// instantiate
Instantiate(commonPokemon[roll].componentObjc, new Vector3(5, 5, 5), Quaternion.identity);
}
else
{
int roll = Random.Range(0, rarePokemon.Count);
// instantiate
Instantiate(rarePokemon[roll].componentObjc, new Vector3(5, 5, 5), Quaternion.identity);
}
}
如果您有另一个列表,您可以添加另一个列表。
而且我认为您不需要通过代码实际将 public 数组初始化为一个大小。这可以在检查器中完成。 (编辑:实际上你不能这样做,因为你想在运行时之前填充列表。)
Random.Range(int a, int b)
是从a(含)到b(不含)。
编辑 2:
我想既然你的数组无论如何都会被转换成列表,你可以摆脱数组并制作列表 public 或者直接使用数组并删除列表(在这种情况下你需要使用 Length
而不是 Count
).
我将以口袋妖怪为例:我有一个包含 10 个元素的列表,每个元素包含:字符串名称、游戏对象、int hp 和 mana int、int rarity。
我需要在每次点击或点击后随机生成一个,即使这么好,但想象一下这 10 个口袋妖怪,其中 2 个非常稀有。
随机后会查看普通或稀有宝可梦。如果常见,它将成为另一个随机数,并且只会选择 1。如果稀有口袋妖怪,选择两个可用的之一。我相信这很混乱。
这个问题,我没能使随机列表不实例化对象。目前我的代码如下..
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
using System.Linq;
public class Pokemons : MonoBehaviour
{
[Serializable]
public class ListPokemons
{
public string name;
public GameObject componentObjc;
public int hp;
public int mana;
public int rarity;
}
public ListPokemons[] pokeAtributs;
// Use this for initialization
void Start ()
{
List<ListPokemons> list = pokeAtributs.ToList ();
//ListPokemons pokemon = list.FirstOrDefault (r => r.componentObjc != null);
}
}
我正在使用 Unity 5。我是葡萄牙语,所有文本均已使用 google translate 翻译。
问题是 public ListPokemons[] pokeAtributs;
在您 List<ListPokemons> list = pokeAtributs.ToList ();
只需使用 new
关键字初始化数组即可。
[Serializable]
public class ListPokemons
{
public string name;
public GameObject componentObjc;
public int hp;
public int mana;
public int rarity;
}
public ListPokemons[] pokeAtributs;
// Use this for initialization
void Start ()
{
//You are missing this part in your code (10 pokeAtributs )
pokeAtributs = new pokeAtributs[10];
//Now you can do your stuff
List<ListPokemons> list = pokeAtributs.ToList ();
}
我觉得你应该在两个不同的列表中组织你的稀有和常见。
可能是这样的(这是一个模型):
// fill these in the inspector. you don't need the extra arrays.
public List<ListPokemons> rarePokemon;
public List<ListPokemons> commonPokemon;
...
void PickPokemon()
{
int rarityRoll = Random.Range(0, 100);
if(rarityRoll < 80)
{
// choose something from common
int roll = Random.Range(0, commonPokemon.Count);
// instantiate
Instantiate(commonPokemon[roll].componentObjc, new Vector3(5, 5, 5), Quaternion.identity);
}
else
{
int roll = Random.Range(0, rarePokemon.Count);
// instantiate
Instantiate(rarePokemon[roll].componentObjc, new Vector3(5, 5, 5), Quaternion.identity);
}
}
如果您有另一个列表,您可以添加另一个列表。
而且我认为您不需要通过代码实际将 public 数组初始化为一个大小。这可以在检查器中完成。 (编辑:实际上你不能这样做,因为你想在运行时之前填充列表。)
Random.Range(int a, int b)
是从a(含)到b(不含)。
编辑 2:
我想既然你的数组无论如何都会被转换成列表,你可以摆脱数组并制作列表 public 或者直接使用数组并删除列表(在这种情况下你需要使用 Length
而不是 Count
).