2015-12-01 1 views
2

J'ai un script Unity fonctionnel avec multi-touch qui va détecter le toucher, voir si le toucher a frappé un collisionneur (partie d'un gameObject), puis vérifier pour voir si c'est le bon collisionneur, et le détruire. Voici le code de travail:Comment ajouter une minuterie?

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

Ceci est le code de travail. Maintenant, je veux ajouter une minuterie là-bas, et je veux que le temps de la touche. Je veux faire en sorte que le joueur puisse taper, et déplacer son doigt sur le poisson et cela comptera, tant que le joueur a déplacé son doigt sur le poisson en 1 seconde. Voici le script que j'ai écrit et j'ai besoin d'aide pour:

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

C'est tout ce que j'ai jusqu'ici. J'ai essayé d'utiliser une instruction return, et cela n'a pas fonctionné dans la fonction Void Update(). J'ai essayé de faire une autre fonction avec une boucle while qui attendrait que chaque image soit terminée avant de passer par une autre boucle. Cela n'a pas fonctionné. Cette idée va-t-elle marcher?

Répondre

0

Voici une minuterie simple dans Unity. Mettez CheckTimer() sur votre méthode 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.. 
    } 
} 

Dans votre cas, vous pouvez définir un bool true lorsque votre condition est remplie, puis faire en sorte que CheckTimer() ne fonctionne que lorsque la condition est vraie.

+0

Je ne sais pas comment ce code sera géré. Avant de commencer les tests, je vais vous dire comment ce code peut ou non fonctionner. Donc, dès le départ, nous définissons des variables privées. Ces variables devraient pouvoir être dupliquées pour chaque touche. Ces codes doivent également rester cohérents sur chaque trame vide update(). Je pense que c'est peut-être une mauvaise idée d'essayer d'ajouter un facteur temps à l'intérieur d'une fonction void update(). Ce que je peux finir par essayer est une mise à jour vide() qui déclenche une autre fonction lorsque le toucher est détecté. L'autre fonction sera IEnumerator et aura le reste du code. –

0

Pour résoudre ce faire la minuterie une variable globale par instancier en haut et faire comme suit

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

Je n'ai pas le reste de votre code pour assurer cela fonctionne, mais la logique derrière le fait . Vous voulez régler votre minuterie sur l'heure actuelle plus une durée donnée. Si l'heure actuelle est inférieure à la minuterie que vous avez réglée lorsque le joueur fait quelque chose, alors vous savez qu'ils ont fait leur action avant que le temps n'atteigne le chronomètre. Cela a-t-il du sens?

0

Je sais que je ne suis pas supposé prendre des espaces de commentaires en disant merci, mais merci Jonnus. La seule chose qui me déroute maintenant, c'est comment je n'y ai pas pensé plus tôt. De toute façon, voici le code à emporter pour toute personne qui a besoin d'aide avec un script multi-touch.

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

Encore une fois, un grand merci à Jonnus. Je pensais que ce serait beaucoup plus compliqué. Aussi, ne fais pas ce que j'ai fait et oublie de fixer la durée dans l'interface et finis par passer 10 minutes à chercher un problème ... Fais-moi confiance c'est agaçant.