#c# #unity3d #3d
#c# #unity3d #3D
Вопрос:
Я пытаюсь создать игру, в которой таймер срабатывает после столкновения с одним из персонажей. Я изо всех сил пытаюсь создать правильный код для этого. Вот что у меня есть:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Timer : MonoBehaviour
{
public GameObject textDisplay;
public int secondsLeft = 30;
public bool takingAway = false;
void OnTriggerEnter(Collider other) instead of Start?
{
if (other.CompareTag("Player"))
{
textDisplay.GetComponent<Text>().text = "00:" secondsLeft = true;
}
void Start(){
textDisplay.GetComponent<Text>().text = "00:" secondsLeft;
}
void Update()
{
if (takingAway == false amp;amp; secondsLeft > 0)
{
StartCoroutine(TimerTake());
}
}
IEnumerator TimerTake()
{
takingAway = true;
yield return new WaitForSeconds(1);
secondsLeft -= 1;
textDisplay.GetComponent<Text>().text = "00:" secondsLeft;
takingAway = false;
}
}
Ответ №1:
Похоже, что вы пытаетесь:
- каждую секунду сокращайте на одну секунду
- если игрок столкнется, остановите таймер
Я бы, вероятно, сделал это примерно так
public class Timer : MonoBehaviour
{
// directly give your field the correct type
public Text textDisplay;
public int secondsLeft = 30;
// Optionally add some events to be invoked
// these are like the onClick of Buttons
// This event is invoked when the player didn't reach in time
public UnityEvent whenTimedOut;
// This event is invoked when the player stopped the timer
public UnityEvent whenStoppedByPlayer;
// If return type is IEnumerator Unity runs Start
// automatically as Coroutine
private IEnumerator Start()
{
while(secondsLeft > 0)
{
textDisplay.text = "00:" secondsLeft;
yield return new WaitForSeconds(1);
secondsLeft --;
}
textDisplay.text = "00:" secondsLeft;
whenTimedOut.Invoke();
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
// by disabling this component also the Coroutine is stoppepd
enabled = false;
textDisplay.text = "00:" secondsLeft;
whenStoppedByPlayer.Invoke();
}
}
}
Или вы пытаетесь запустить таймер после того, как игрок его запустил? В этом случае вы можете напрямую запустить это также как сопрограмму, например,
private IEnumerator OnTriggerEnter(Collider other)
{
if (!other.CompareTag("Player")) yield break;
while(secondsLeft > 0)
{
textDisplay.text = "00:" secondsLeft;
yield return new WaitForSeconds (1);
secondsLeft--;
}
textDisplay.text = "00:" secondsLeft;
whenTimedOut.Invoke();
}
Комментарии:
1. Да, я пытался запустить таймер после того, как игрок его запустил. Большое вам спасибо! Это последний код, который я использовал:
2.
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class Countdown : MonoBehaviour{ public Text textDisplay; public int secondsLeft = 30; private IEnumerator OnTriggerEnter(Collider other) { if (!other.CompareTag("Player")) yield break; while(secondsLeft > 0) { textDisplay.text = "00:" secondsLeft; yield return new WaitForSeconds (1); secondsLeft--; } textDisplay.text = "00:" secondsLeft; } }