Unity:从random.range中删除所选对象 [英] Unity: Remove The selected object from random.range

查看:104
本文介绍了Unity:从random.range中删除所选对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个有多个选择的测验游戏.我想显示随机问题,但是有时会多次选择相同的问题.我想从列表中删除选定的问题,以便不再被选中..

I have a Quiz game with multiple choices. I Want to show random question however sometimes the same Questions is being picked more than once. I want to remove the selected questions out of my list so it doesn't get picked anymore..

这是显示我问题的游戏管理器 **在我随机检查的地方查看ShowQuestion函数.我基本上希望选择问题时不再显示

This is the Game Manager that shows my question's ** Check the ShowQuestion Function there where i do my random. i basically want when a question is picked to not show again

public class GameController : MonoBehaviour {

private dataController DataController;
private roundData currentRoundData;
// QUestions that we will be working with in this round
private questionData[] questionPool;
private List<GameObject> answerButtonGameobjects = new List<GameObject>();

private List<GameObject> QuestionGameobjects = new List<GameObject>();


[Header("OTHER")]
public SimpleObjectPool answerButtonObjectPool;
public Transform answerButtonParent;


[Tooltip("Variables")]
// is the game going? 
private bool isRoundActive;
private float timerRemaing;
// What number question we are on
private int questionIndex;
private int questionNumber = 1;
private int totalQuestions;



[Header("UI")]
[Header("TEXT ")]
public Text questionText;
public Text scoreDisplayText;
public Text timeRemainingDisplayText;
public Text highScoreText;
public Text questionIndexText;

void Start () {

    DataController = FindObjectOfType<dataController>();

    currentRoundData = DataController.getCurrentRoundData();



    // stores our questions
    questionPool = currentRoundData.questions;

    timerRemaing = currentRoundData.timeLimitInSeconds;

    questionIndex = 0;

   totalQuestions = 10;


    ShowQuestion();

}

// Show our 1st question
private void ShowQuestion()
{
    RemoveAnsweredButtons();


    // Hold current question data from our pool
   questionData QuestionData = questionPool[Random.Range(0, totalQuestions)];

    questionText.text = QuestionData.questionText;

    for (int i = 0; i < QuestionData.answers.Length; i++)
    {
        GameObject answerButtonGameobject = answerButtonObjectPool.GetObject();
        answerButtonGameobject.transform.SetParent(answerButtonParent);
        answerButtonGameobjects.Add(answerButtonGameobject);

        AnswerButton answerButton = answerButtonGameobject.GetComponent<AnswerButton>();
        answerButton.Setup(QuestionData.answers[i]);
    }


}

/// <summary>
/// Removes the old answers button before we display new ones.
/// </summary>
private void RemoveAnsweredButtons()
{
    while (answerButtonGameobjects.Count > 0)
    {
        answerButtonObjectPool.ReturnObject(answerButtonGameobjects[0]);
        answerButtonGameobjects.RemoveAt(0);
    }


}




private void UpdateQuestionIndex()
{
    questionIndex++;

    questionNumber++;
    questionIndexText.text = "Question  " + (questionNumber.ToString()) +  " out of 10";
}



}

使用从Unity站点获取的简单池系统生成问题和答案.

The Questions and Answers are being generated using a Simple pool system that was taken from Unity Site.

这里是池类

using UnityEngine;
using System.Collections.Generic;

// A very simple object pooling class
 public class SimpleObjectPool : MonoBehaviour
{
// the prefab that this object pool returns instances of
public GameObject prefab;
// collection of currently inactive instances of the prefab
private Stack<GameObject> inactiveInstances = new Stack<GameObject>();

// Returns an instance of the prefab
public GameObject GetObject() 
{
    GameObject spawnedGameObject;

    // if there is an inactive instance of the prefab ready to return, return that
    if (inactiveInstances.Count > 0) 
    {
        // remove the instance from teh collection of inactive instances
        spawnedGameObject = inactiveInstances.Pop();
    }
    // otherwise, create a new instance
    else 
    {
        spawnedGameObject = (GameObject)GameObject.Instantiate(prefab);

        // add the PooledObject component to the prefab so we know it came from this pool
        PooledObject pooledObject = spawnedGameObject.AddComponent<PooledObject>();
        pooledObject.pool = this;
    }

    // put the instance in the root of the scene and enable it
    spawnedGameObject.transform.SetParent(null);
    spawnedGameObject.SetActive(true);

    // return a reference to the instance
    return spawnedGameObject;
}

// Return an instance of the prefab to the pool
public void ReturnObject(GameObject toReturn) 
{
    PooledObject pooledObject = toReturn.GetComponent<PooledObject>();

    // if the instance came from this pool, return it to the pool
    if(pooledObject != null && pooledObject.pool == this)
    {
        // make the instance a child of this and disable it
        toReturn.transform.SetParent(transform);
        toReturn.SetActive(false);

        // add the instance to the collection of inactive instances
        inactiveInstances.Push(toReturn);
    }
    // otherwise, just destroy it
    else
    {
        Debug.LogWarning(toReturn.name + " was returned to a pool it wasn't spawned from! Destroying.");
        Destroy(toReturn);
    }
}
}

// a component that simply identifies the pool that a GameObject came from
public class PooledObject : MonoBehaviour
{
  public SimpleObjectPool pool;
}

推荐答案

未经测试,香草'psuedo'C#为您提供指南

It's untested, and vanilla 'psuedo' C# to give you a guideline

private List<int> _questions = null;
private int _current = 0;
void Start()
{
    _questions = Enumerable.Range(0, questionPool.Length).ToList();
    Shuffle(_questions);
}
void Shuffle(List<int> list)
{
    // put fisher-yates algorithm here to shuffle the numbers
}
void ShowQuestion()
{
    var idx = _questions[_current++];
    var questionData = questionPool[idx];
}

这篇关于Unity:从random.range中删除所选对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆