I have a Raycast
and there can be multiple objects in front of the object that casts the ray.
I want to ignore some of the objects, say object "A"
(tag). In the below situation, I want the Raycast
to hit to the object "B"
(tag):
Player Raycast ---- "A"
---- "B"
—>
I have seen some answers including “layers”. I have no idea if they are necessary in this situation, and I don’t know how to use them or what they are, either.
How am I supposed to do this?
Just select Layer “Ignore raycast” for the particular object to not affect your raycast so the u can find the object behind it.
If you have a reference to the specific object, instead of creating layers or checking all hits, you can just temporarily disable the object’s collider for the raycast, then re-enable it.
You want to use layers. Here is a reference page that explains layers:
Alternately you can use Physics.RaycastAll()
, and then sort through the unsorted list of hits.
Using layers is more efficient. RaycastAll()
is more flexible since you can setup specific criteria.
From the docs:
RaycastHit[] hits = Physics.RaycastAll( transform.position , transform.forward , 100.0F );
One thing that can be confusing about Raycasts when you first encounter them: hits
will be a variable of all things you hit, you can access the hit object itself from the hit.
The other concepts that are confusing with Raycast
s are the out variable (which basically assign the response to the out var
even though it is a parameter) and the QueryTriggerInteraction
which simply tells the Raycast
to ignore Triggers
and can be set with QueryTriggerInteraction.Ignore
. The default behavior is to include triggers so you only need that if you want to remove triggers from the Raycast
.
[SerializeField] Transform _targetTransform = null;// target assigned in inspector
[SerializeField] LayerMask mask;// set in inspector
RaycastHit[] hits = Physics.RaycastAll( transform.position , transform.forward , 100.0f , mask );
for( int i=0 ; i<hits.Length ; i++ )
{
RaycastHit hit = hits[i];
if( hit.transform==_targetTransform )
{
// Look for a specific transform instance
}
// Or get a specific Component
Ship theShipWeHit = hit.transform.GetComponent<Ship>();
if( theShipWeHit!=null )
{
// Found something with a specific script, such as Health or whatever
}
// Or get a specific Tag
if( hit.transform.gameObject.CompareTag("Tag") )
{
// Found something with a given tag.
}
}