Таймер срабатывания после столкновения

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