2017-08-31 2 views
0

J'utilise SendMessage pour informer l'objet qui a été frappé par un raycast:Faire un objet à détecter que raycast pas frapper plus

 using UnityEngine; 

public class Raycaster : MonoBehaviour { 
    void Update() { 
     RaycastHit hit; 
     if (Physics.Raycast(transform.position, transform.forward, out hit)) 
      if(hit.transform.tag == "MyGameObject"){ 
      hit.transform.SendMessage ("HitByRay"); 
      } 
    } 
} 

et l'objet ont un script comme celui-ci:

using UnityEngine; 

public class ObjectHit : MonoBehaviour { 
    void HitByRay() { 
     Debug.Log ("I was hit by a Ray"); 
    } 
} 

Et ce message imprimé "J'ai été frappé par Ray" dans chaque image. Maintenant, je dois informer cet objet de jeu qui raycast ne plus le frapper.

+0

stocker une référence à l'objet a frappé la dernière fois, si le nouvel objet = le dernier objet, ou ne marche pas raycast touché quoi que ce soit cette fois-ci, dit l'objet de son pas se faire frapper plus!. – Eddge

Répondre

0

@Eddge est correct, stocker une référence à l'objet gameobject est le chemin à parcourir. Vérifiez le code suivant:

public class Raycaster : MonoBehaviour 
{ 
    private bool hitting = false; 
    private GameObject hitObject; 

    void Update() 
    { 
     RaycastHit hit; 
     if (Physics.Raycast(transform.position, transform.forward, out hit)) 
     { 
      if(hit.transform.tag == "MyGameObject") 
      { 
       GameObject go = hit.transform.gameobject ; 

       // If no registred hitobject => Entering 
       if(hitObject == null) 
       { 
        go.SendMessage ("OnHitEnter"); 
       } 
       // If hit object is the same as the registered one => Stay 
       else if(hitObject.GetInstanceID() == go.GetInstanceID()) 
       { 
        hitObject.SendMessage("OnHitStay"); 
       } 
       // If new object hit => Exit last + Enter new 
       else 
       { 
        hitObject.SendMessage("OnHitExit"); 
        go.SendMessage ("OnHitEnter"); 
       } 

       hitting = true ; 
       hitObject = go ; 
      } 
     } 
     // No object hit => Exit last one 
     else if(hitting) 
     { 
      hitObject.SendMessage("OnHitExit"); 
      hitting = false ; 
      hitObject = null ; 
     } 
    } 
} 
+0

Merci, c'était bon. Mais est-ce que je peux le faire d'une manière ou d'une autre avec la boucle WHILE, je pense que cela nécessite beaucoup moins de code? Par exemple envoyer un message à l'objet "Hit" et mettre un script sur cet objet comme, alors que (je reçois le message "Hit") {faire quelque chose} –

+0

Je ne pense pas que cela nécessitera moins de code. J'ai suggéré d'utiliser les 3 fonctions 'OnHitEnter',' OnHitStay' et 'OnHitExit' afin d'être flexible. Vous devez simplement implémenter les fonctions données dans un script que vous attachez aux cibles possibles de vos raycast. Si vous le souhaitez, vous pouvez avoir sur l'objet cible une variable 'hit' que vous avez définie' true' dans 'OnHitEnter' et' false' dans 'OnHitExit', puis dans la fonction' Update' la condition suivante 'si (frapper) {faire quelque chose(); } ' – Hellium

+0

Ouais je le fais déjà, ça marche bien. Merci! –