How to know if an object is looking at an other

Hi,
I’m trying to know if an object is looking at an other object. I don’t want to rotate the first in order for it to see the second, just checking if it’s looking, so I don’t need Transform.LookAt. Also, is it possible to return true if the object is not perfectly looking at the second ? (The 2nd object can be in a radius of say 5 degrees)

Take the dot product of the facing direction of ObjA compared to the direction from ObjA to ObjB.

  • If it’s 1, ObjA is looking exactly at ObjB.
  • If it’s -1, ObjA is looking completely the opposite direction to ObjB
  • If it’s somewhere between 0 and 1, they’re looking roughty in the right direction - you choose the threshold for what you want to define as “not perfectly”.

Untested code follows:

 Vector3 dirFromAtoB = (ObjB.transform.position - ObjA.transform.position).normalized;
 float dotProd = Vector3.Dot(dirFromAtoB, ObjA.transform.forward);

 if(dotProd > 0.9) {
   // ObjA is looking mostly towards ObjB
 }

There’s a couple of ways you can do this. IF you care about line of sight (not obstructed by something) You will want to do a raycast from object a to b and then get the viewing angle to see if it’s appropriate. Another approach would just to be just using multiple raycasts in the direction you want to check.

You could use something like the following. Apologize in advance if there’s a typo.

GameObject target;
Float distance=10f;
Vector3 hostPos=gameObject.Transform.position;
Vector3 targetPos=target.Transform.position;
Ray ray=new Ray(hostPos,(targetPos-hostPos).normalized*10);
RaycastHit hit;
if(Physics.Raycast(ray,out hit,distance))
{
	if(hit.collider.gameObject==target)
	{
		float angle = Vector3.Angle((targetPos - hostPos), gameObect.Transform.forward);
		if(angle<5f)
		{
			//Do something
		}
	}
}

if there is a distance set limit to the view distance you could create a trigger area shaped like a cone and attached to the object that you need the info from. and then raycast to see if it’s hidden behind walls.