gpt4 book ai didi

c# - unity : Remove The selected object from random.范围

转载 作者:太空宇宙 更新时间:2023-11-03 23:04:49 24 4
gpt4 key购买 nike

我有一个有多种选择的测验游戏。我想显示随机问题,但有时会多次选择相同的问题。我想从我的列表中删除选定的问题,这样它就不会再被选中了..

这是显示我的问题的游戏管理器** 检查那里的 ShowQuestion 函数,我在那里随机进行。我基本上希望在选择问题时不再显示

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 站点的简单池系统生成的。

这是池类

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

最佳答案

它未经测试, Vanilla “伪”C# 为您提供指导

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];
}

关于c# - unity : Remove The selected object from random.范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41698506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com