2017-08-31 38 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

是的,我已經這樣做了,它工作正常。謝謝! –