2015-12-01 4 views
2

У меня есть рабочий Unity-скрипт с мультитач, который обнаружит касание, посмотрите, удалось ли нажатие на коллайдер (часть объекта gameObject), а затем проверьте, является ли он правильным коллайдером и уничтожает его. Вот рабочий код:Как добавить таймер?

using UnityEngine.UI; 
using UnityEngine; 
using System.Collections; 

public class GameController : MonoBehaviour 

{ 

    void Update() // Updates every frame 
    { 
     if (Input.touchCount != 0) // Triggered by a touch 
     { 
      foreach (Touch touch in Input.touches) // Triggered as many times as there are touches. 
      { 
       RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touch.position), Vector2.zero); 
       if (hit && touch.phase == TouchPhase.Began && hit.collider.gameObject.tag ==("Fish")) // Triggered if touch hits something, when touch just begins, and if the object hit was tagged as a "Fish" 
       { 
        hit.collider.gameObject.GetComponent<FishScript>().TappedOut(); // Fish script activated 
       } 
      } 
     } 
    } 
} 

Это рабочий код. Теперь я хочу добавить там таймер, и я хочу, чтобы это время прикосновения. Я хочу сделать так, чтобы игрок мог нажать, и переместить палец над рыбой, и это будет считаться, пока движется пальцем по рыбе за 1 секунду. Вот сценарий, который я написал и нуждаюсь в помощи:

using UnityEngine.UI; 
using UnityEngine; 
using System.Collections; 

public class GameController : MonoBehaviour 

{ 

    void Update() // Updates every frame 
    { 
     if (Input.touchCount != 0) // Triggered by a touch 
     { 
      foreach (Touch touch in Input.touches) // Triggered as many times as there are touches. 
      { 
       if (touch.phase == TouchPhase.Began) 
       { 
        float touchTimer = Time.time; 
        int i = touch.fingerId; 
       } 
       RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touch.position), Vector2.zero); 
       if (hit && hit.collider.gameObject.tag ==("Fish")) // Triggered if touch hits something, when touch just begins, and if the object hit was tagged as a "Fish" 
       { 
        hit.collider.gameObject.GetComponent<FishScript>().TappedOut(); // Fish script activated 
       } 
      } 
     } 
    } 
} 

Это все, что у меня есть до сих пор. Я попытался использовать оператор return, и это не работает в функции Void Update(). Я попытался сделать еще одну функцию с циклом while, который будет ждать, пока каждый кадр не закончится, прежде чем переходить через другой цикл. Это не сработало. Будет ли эта идея работать?

ответ

0

Вот простой таймер в Unity. Поместите CheckTimer() на ваш метод Update().

private double counter = 0.000d; 
public double time = 2.000d; // How many seconds you want your timer to run 

void CheckTimer() 
{ 
    counter+= Time.deltaTime; 
    if (counter >= time) 
    { 
     // Time has passed 
     counter = 0.000d; 
     // Do stuff here.. 
    } 
} 

В вашем случае, вы можете установить логическое значение для истинно, когда ваше условие выполнено, то сделать так, чтобы CheckTimer() работает только тогда, когда условие истинно.

+0

Я не уверен, как будет обрабатываться этот код. Прежде чем начать тестирование, я расскажу вам, как этот код может работать или не работать. Итак, сразу с места в карьер, мы определяем частные переменные. Эти переменные должны были быть продублированы для каждого касания. Эти коды также должны оставаться постоянными в каждом кадре void update(). Я думаю, что это может быть плохая идея, чтобы попытаться добавить фактор времени внутри функции void update(). То, что я могу попробовать, это void update(), которое запускает другую функцию при обнаружении касания. Другая функция будет IEnumerator, и остальная часть кода в ней. –

0

Чтобы исправить это сделать таймер глобального переменным инстанцирования его в верхнем и сделать следующим образом

using UnityEngine.UI; 
using UnityEngine; 
using System.Collections; 

public class GameController : MonoBehaviour 

{ 
public float timer; 
public float duration; 

void Start(){ 
duration = 1; //you can set this in code or in your hierarchy in Unity 
} 
    void Update() // Updates every frame 
    { 
     if (Input.touchCount != 0) // Triggered by a touch 
     { 

      foreach (Touch touch in Input.touches) // Triggered as many times as there are touches. 
      { 
       if (touch.phase == TouchPhase.Began) 
       { 
        timer = Time.time + duration; 
       } 
if(Time.time < timer){ 
       RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touch.position), Vector2.zero); 
       if (hit && hit.collider.gameObject.tag ==("Fish")) // Triggered if touch hits something, when touch just begins, and if the object hit was tagged as a "Fish" 
       { 
        hit.collider.gameObject.GetComponent<FishScript>().TappedOut(); // Fish script activated 
       } 
      } 
} 
     } 
    } 
} 

я не имею остальную часть кода, чтобы обеспечить это работает, но логика позади него делает , Вы хотите установить свой таймер на текущее время плюс заданная продолжительность. Если текущее время меньше таймера, установленного вами, когда игрок что-то делает, вы знаете, что они выполнили свое действие до достижения таймера. Имеет ли это смысл?

0

Я знаю, что я не должен занимать пространство комментариев, говоря спасибо, но спасибо Jonnus. Единственное, что меня озадачивает, это то, как я раньше не думал об этом. В любом случае, вот код отмены для любого, кому нужна помощь с мультитач-скриптом.

using UnityEngine.UI; 
using UnityEngine; 
using System.Collections; 

    Private float timer;  // Control variable 
    Public float duration; // How long you want your touch to be valid 

Void Start() 
{ 
    duration = 1;    // Also adjustable in the interface 
} 

Void Update() 
{ 
    if (Input.touchCount != 0) // Triggered by a touch 
    { 
     Foreach (Touch touch in Input.touches) // Triggered as many times as there are touches 
     { 
      if (touch.phase == TouchPhase.Began) 
      { 
       timer = Time.time + duration; 
      } 
      RaycastHit2D objectPlayerTouched = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(touch.position), Vector2.zero); 
      // var objectPlayerTouched is the 2DCollider for whatever the player tapped on. 
      if (objectPlayerTouched != null && Time.time < timer) // Triggered if player taps an object and time is still valid 
      { 
       objectPlayerTouched(destroy); // This means whatever object the player tapped is now destroyed 
      } 
     } 
    } 
} 

Еще раз большое спасибо Jonnus. Я думал, что это будет намного сложнее. Кроме того, не делайте то, что я сделал, и забудьте установить продолжительность в интерфейсе и в конечном итоге потратить 10 минут на поиски проблемы ... Поверьте мне, это раздражает.

Смежные вопросы