随机列表对象并实例化游戏对象

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