- Home /
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)
Answer by tanoshimi · Jul 19, 2015 at 04:24 PM
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
}
Thank you! It is very simple and works like a champion :)
Answer by etopsirhc · Jul 19, 2015 at 04:26 PM
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.
Answer by Raven-Rock · Jul 19, 2015 at 04:35 PM
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
}
}
}
Your answer
Follow this Question
Related Questions
RotateAround doesnt work 1 Answer
Transform.LookAt - Look through Y-Axis? 1 Answer
How to prevent Z axis rotation ? 0 Answers
Rotating a bone via scripts 1 Answer