2016-04-29 3 views
0

Я буду использовать Pokemon в качестве примера: у меня есть список из 10 элементов, каждый элемент содержит: имя строки, GameObject, int hp и mana int, int rarity.случайный объект списка и экземпляр gameObject

Мне нужно после каждого щелчка или нажатия, делается случайным, даже настолько хорошим, но представьте, что эти 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.

+0

Подсказка. Редкие элементы - это случайное число от 100 до 10000 (низкая вероятность получения одного и того же номера дважды), а затем назначить флаг как _rare_. Общие элементы являются случайными между 0 и 100 (более высокая возможность), также назначают флаг _common_. –

+1

Вам нужно распределение (математика). Но, что я обычно делаю в таких случаях, я решаю, сколько редких покемонов и сколько общих я дам. Скажем, 98 общих, 2 раста. Я делаю 2 случайных броска 1-100, чтобы решить, куда идут ракеты, или даже составить список исправлений, заполнить соответственно и не прокатывать время игры, просто выбирая следующий элемент списка; таким образом, вы будете «беспристрастны», как и в противном случае (также математика: честная монета), которой вы, возможно, не будете. Кстати, почему ListPokemons не является структурой? Также используйте Awake() вместо Start(), если вы управляете GObjs –

ответ

0

Похоже, вы должны организовать свои редкие и распространенные в двух разных списках.

Что-то вроде этого, может быть, (это макет):

// 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); 
    } 
} 

Если у вас есть еще один список, вы можете добавить еще один рулон вокруг этого.

И я не думаю, что вам нужно фактически инициализировать публичные массивы размером с помощью кода. Это можно сделать в инспекторе. (Изменить: на самом деле вы не должны этого делать, потому что вы хотите заполнить список до времени выполнения.)

Random.Range(int a, int b) от (включительно) до b (исключительно).

Edit 2:
Я думаю, так как ваши массивы будут преобразованы в списки в любом случае вы можете просто избавиться от массивов и сделать списки государственными или работать с массивами непосредственно и удалять списки (в этом случае вам нужно используйте Length вместо Count).

+0

tks, но, commonPokemon.Count или редкийPokemon.Count, не существует в текущем контексте. –

+0

Моя ошибка, очевидно, они должны быть членами. Я редактирую это. –

+0

Я еще не тестировал, потому что у них нет полного кода здесь, прежде чем вы сможете проверить. но ошибка исчезла, и все кажется правильным в инспекторе. Я был бы счастлив добавить вас в skype me, иногда было бы здорово иметь несколько идей. [email protected] –

0

Проблема заключается в том, что общественное 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(); 

} 
Смежные вопросы