- Home /
Detect if raycast hit the specific object.
Hello everyone.
I'm trying to check when I throw the grenade if all effected object in the range are in sight. I'm doing that by casting a ray from the grenade object to the each of the effected objects. And if the ray hits the effected object only then damage the object. But everytime I try to do that I noticed that the ray goes through other objects and still damages the effected object even if it's behind the wall.. Can someone please help me with this? Thank you!
Picture:
The Script:
void AddExplosiveForce(Vector3 centerOfEx, float damage)
{
explosionRadius = Random.Range(defaultExplosionRadius, defaultExplosionRadius + defaultExplosionRadius / 2);
Collider[] thingsToHit = UnityEngine.Physics.OverlapSphere(centerOfEx, explosionRadius, effectedLayers);
foreach (Collider hit in thingsToHit)
{
RaycastHit hitInfo;
Ray rayToCameraPos = new Ray(transform.position, hit.transform.position - transform.position);
Debug.DrawRay(transform.position, hit.transform.position - transform.position, Color.red, 5f);
if (Physics.Raycast(rayToCameraPos, out hitInfo, 1000, effectedLayers))
{
if (hitInfo.collider.tag == hit.tag)
{
Debug.Log(hit.name + " TRUE");
if (hit.GetComponent<Rigidbody>() != null && hit.gameObject.GetComponent<LandMine>() == null)
{
hit.GetComponent<Rigidbody>().AddExplosionForce(explosionForce, centerOfEx, explosionRadius, 1, ForceMode.Impulse);
}
float proximity = (centerOfEx - hit.transform.position).magnitude;
float effect = 1 - (proximity / explosionRadius);
if (hit.gameObject.GetComponent<LandMine>() != null)
{
hit.gameObject.GetComponent<LandMine>().time = 0.25f;
}
hit.gameObject.SendMessage("ApplyDamage", damage * effect, SendMessageOptions.DontRequireReceiver);
}
else
{
Debug.Log(hit.name + " FALSE");
}
}
}
}
Answer by Twistorian · Sep 24, 2017 at 11:57 PM
Hi @Maxesone,
If I'm not mistaken, your mistake is on line 12:
if (Physics.Raycast(rayToCameraPos, out hitInfo, 1000, effectedLayers))
If I interpret it correctly, here you are checking whether the grenade explosion actually hits the target, that has been picked by Collider[] thingsToHit array in OverlapSphere.
I assume your effectedLayers contains everything the grenade can affect. However, if the wall is not part of the effectedLayers, then the Raycast on line 12 will ignore the wall and hit the player anyway.
So, make the wall part of the effectedLayers, or make another LayerMask (e.g. extendedEffectedLayers) that also contains the wall, and therefore the raycast from grenade explosion hits the wall first before hitting the player.
Your answer
Follow this Question
Related Questions
Changing position of a RayCast 1 Answer
What's wrong with my RaycastHit2D? 1 Answer
Physics.Raycast intermittently stops working 1 Answer
Checking Child collisions through parents 1 Answer
[Unsolved] Raycast isn't casting 0 Answers