- Home /
Get a point on raycast when collision = false
hi, im making a grapling gun script and have some issues when aiming it. its a third person game and im using raycast from cam to mouseposition to aim my gun. but whenever my ray is not hitting an object it automatically points towards the Scene origin and i cant fire my gun to where i was supossed to be pointing at. here is part of the script.
RaycastHit hit;
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
Physics.Raycast (ray, out hit);
float dist= Vector3.Distance(Grap.transform.position, hit.point);
Debug.DrawLine(Grap.transform.position, hit.point);
//on click
if (Input.GetButtonDown(button)){
//when shooting get target position
target=hit.point;
if (Physics.Raycast (ray, out hit)==false){
Debug.Log ("out of range");
Vector3 screenpoint=Input.mousePosition;
screenpoint.z=range;
target=(Grap.transform.position+ray.direction*range).normalized;
Debug.DrawLine(Grap.transform.position, ray.direction*range);
}
Debug.Log ("target"+target);
//instanciate hook
hookinstance=Instantiate(hook, Grap.transform.position,Grap.transform.rotation)as GameObject;
//shoot hook
hookinstance.rigidbody.AddForce(Vector3.Normalize(target-transform.position)*shootForce);
shoot=true;
}
$$anonymous$$aybe the more important code is missing at the bottom. I noticed on line 3, you are using hit, even though RayCast may have returned false. Then you aren't using dist in the code shown, so I suspect it is used further down. You shouldn't use dist when no object is hit in RayCast.
Answer by robertbu · Nov 18, 2013 at 05:41 AM
Your logic here has a couple of problems. A RaycastHit gets it value from the Physics.Raycast() call. If the call fails, then the value is either uninitialized or it is stale. You do two raycast calls, and you don't check the return value from the first. Usually when you have a situation like this one where you want a 'target' when the Raycast() fails, then you decide on a distance and calculate a point from the distance. Typically the logic would look like:
RaycastHit hit;
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast (ray, out hit)) {
target = hit.point;
}
else {
target = ray.GetPoint(range);
}
Note that the origin of the ray created by ScreenPointToRay() is the camera's near clip plane.
Your answer

Follow this Question
Related Questions
camera.ScreenPointToRay always has same origin... 1 Answer
How can I can I cast a ray from a gameobject? 1 Answer
Raytracing through an octree? 0 Answers
My Raycast on awake fires and will not change Help! 0 Answers
GameObject follow mouse 1 Answer