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:

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

Make sure you’re casting the ray from the grenade point and out, not from where you want the ray to stop and then inwards.

I would do a distance check then a raycast to any gameobject thats within that distance. If the raycast hits the gameobject…blow it to pieces!

Do you mean like this?

Ray rayToCameraPos = new Ray(transform.position, (hit.transform.position - transform.position));
            Debug.DrawRay(transform.position, (hit.transform.position - transform.position), Color.red, 5f);

Alright, found the solution!

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;

            Debug.DrawRay(transform.position, (hit.transform.position - transform.position), Color.red, 5f);
            if (Physics.Raycast(transform.position, (hit.transform.position - transform.position), out hitInfo, 1000))
            {
                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");
                }
            }
        }
    }

That’s… you’re checking if the objects have the same tag. Why not just check if it’s the same object?

//instead of:
if (hitInfo.collider.tag == hit.tag)
//do:
if (hitInfo.collider == hit)

Right now you can hit one object tagged “myTag” if it’s behind some other object tagged “myTag”.

That makes a lot of sense! I don’t know why I checked the tags… Thank you so much for the advice!