2017-08-31 36 views
0

我用SendMessage函数以通知是由光线投射命中对象:使对象检测光线投射不打它了

 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"); 
      } 
    } 
} 

而且对象有一个这样的脚本:

using UnityEngine; 

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

并且在每一帧中都印有“我被雷击中”的消息。 现在我需要通知那个游戏对象,raycast不会再击中它了。

+0

店打到最后时刻对象的引用,如果新对象=的最后一个对象,或光线投射犯规打什么这个时候,告诉它不是得到了命中目标! – Eddge

回答

0

@Eddge是对的,存储引用到命中gameobject是要走的路。请检查下面的代码:

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

谢谢,它是有益的。但是,我可以用WHILE循环以某种方式做到这一点,我认为它需要更少的代码?例如,发送消息到对象“命中”并将脚本放在该对象上,而(我收到消息“命中”){做点事情} –

+0

我不认为它会需要更少的代码。我建议使用3个函数'OnHitEnter','OnHitStay'和'OnHitExit'以便灵活。您只需在脚本中实现给定的功能,将其附加到您的raycast的可能目标。如果你愿意的话,你可以在目标对象上设置一个变量'hit',你在'OnHitEnter'中设置为'true',在'OnHitExit'中设为'false',然后在'Update'函数中设置if (hit){doSomething(); }' – Hellium

+0

是的,我已经这样做了,它工作正常。谢谢! –