После того, как я нажимаю кнопку перезапуска, игра перезапускается, но цели не появляются. когда я впервые запускаю игру, она работает, но после перезапуска цели не появляются, курсор также должен исчезнуть и повернуть его в перекрестье. он пробовал много вещей, но это не работает
public int totalHits = 0;
public int ballHit = 0;
public Image accuracyImage;
public TextMeshProUGUI countDownText;
public TextMeshProUGUI scoreText;
public TextMeshProUGUI performanceText;
public TextMeshProUGUI ballHitText;
public TextMeshProUGUI percentageText;
public float countDown;
public float accuracy = 0f;
public float accuracyFA = 0f;
public bool isGameOver = false;
public FirstPersonController fpsScript;
void Awake()
{
isGameOver = false;
countDown = 120;
StartCoroutine(Spawner());
//InvokeRepeating("Spawner", 1, 1);
}
// Update is called once per frame
void Update()
{
accuracy = ballHit * 100 / totalHits;
if (countDown > 0)
countDown -= Time.deltaTime;
countDownText.text = (countDown).ToString("0");
scoreText.text = accuracy + "%";
if (countDown < 1)
{
isGameOver = true;
}
if (isGameOver)
{
GameOver();
}
accuracyFA = ballHit / totalHits;
//Spawner();
}
IEnumerator Spawner()
{
while (true)
{
yield return new WaitForSeconds(0.5f);
if (countDown > 0 && noOfBalls <= 3)
{
Vector3 position = new Vector3(Random.Range(-270, 230), Random.Range(20, 180), 355);
Instantiate(target, position, target.transform.rotation);
Debug.Log("Spawned");
noOfBalls++;
}
}
}
void GameOver()
{
Time.timeScale = 0f;
fpsScript.RotationSpeed = 0f;
gameOverMenu.SetActive(true);
accuracyImage.fillAmount = accuracyFA / 10;
ballHitText.text = (ballHit).ToString("0");
percentageText.text = accuracy + "%";
HUD.SetActive(false);
if (ballHit <= 40)
{
performanceText.text = "Poor, Need Practice";
}
else if (ballHit <= 70)
{
performanceText.text = "Good, Can Improve";
}
else if (ballHit >= 70)
{
performanceText.text = "Well Done, Keep It Up";
}
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
crossheir.SetActive(false);
}
public void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
цели должны появиться, а курсор должен исчезнуть и превратиться в перекрестие
Я редактирую, так как после разговора с ipodtouch я обнаружил, что моя первая часть неверна, поскольку выход приведет к выходу цикла While(true)
.
То, что указали ipodtouch и bugfinder, является хорошим указанием на то, что может быть причиной проблемы. В методе Gameover
вы устанавливаете Time.timescale
на 0, который не перезапускается при повторной загрузке сцены. Возможно, было бы разумно вернуть ему значение 1 (или любое другое значение, которое вы используете в игре, обычно это 1) в конце метода или при запуске сцены. Возможно, лучше даже не менять Time.timescale
, так как это может испортить код, который может работать.
Хотя я также понимаю и согласен с iPodtouch, что noOfballs перезапускается после повторной загрузки сцены. Переменная не появляется в предоставленном коде, и важно указать ее в скрипте, чтобы знать ее начальные значения, откуда она берется.
private int noOfBalls = 0;
void Awake()
{
noOfBalls = 0;
isGameOver = false;
countDown = 120;
StartCoroutine(Spawner());
//InvokeRepeating("Spawner", 1, 1);
}
Причина, по которой перекрестие, скорее всего, не возвращается, заключается в том, что, как упоминалось ранее, Time.timescale
установлен на 0, а сценарий, отвечающий за внесение указанного изменения, приостановлен. Также вероятно, что сценарий, отвечающий за изменение положения курсора мыши на перекрестии, находится в другой сцене, поэтому он больше не запускается. Убедитесь, что он вызывается.
1) while (true)
подходит для сопрограммы, в которой есть yield
. -- 2) вам не нужно сбрасывать переменную noOfBalls
, поскольку перезагрузка сцены уничтожает и воссоздает все объекты — она вернется к значению по умолчанию.
Я не был уверен, позволяют ли выходные данные завершить выполнение while(true), и хотел убедиться, что оно действительно завершилось. Что касается перезапуска noOfBalls, я не вижу другой причины, по которой предметы не смогут начать возрождаться после перезапуска сцены. Особенно учитывая, что код не показывает создание указанных переменных и присвоение значения.
Скорее всего, просто они никогда не меняют Time.timeScale
обратно с 0, поэтому время никогда не движется, как упоминалось в комментарии BugFinder
Если бы noOfBalls
сбрасывался в новой сцене, разве шкала времени также не сбрасывалась бы после загрузки новой сцены?
Time.timeScale
— статическая переменная, она никогда не будет сброшена/переинициализирована. (потому что Unity не создает экземпляр new Time
)
Вы правы. Я обновлю свой ответ, включив его сверху, чтобы показать проблему с timeScale
, и удалю часть while(true)
. Поскольку он не упоминается в коде, где создается noOfBalls
и устанавливается значение, я оставлю его как нечто, что пользователю необходимо включить.
Только что обновил информацию. Надеюсь, теперь это достаточно хорошо, чтобы не проголосовать против.
Спасибо. Ваши ответы действительно помогли, и проблема решена. Последнее, что вы можете мне предложить, как добавить возможность настройки чувствительности мыши в игре.
В следующем уроке, который я нашел, содержится подробное объяснение того, как они это сделали. m-ansley.medium.com/… Я не знаю, есть ли технически лучшая версия, о которой знает кто-то еще, но эта кажется хорошей.
Спасибо, это то, что я искал
возможно, вы никогда не сбрасываете шкалу времени с 0?