x


Aiming Gun at Cursor

I know that there are some posts out there that kind-of cover this, but I'm new to Unity and I'm working on a FPS prototype trying to figure out how to have the gun always point to the cursor in the center of the screen.

There are a few good scripts out there, however I do not know where to place them, or if they are necessarily the best thing as far as performance is concerned (using Ray casting and getting the distance of the nearest object at the position of the cross-hairs)

There are two scripts I have found in the forums below. Which is better to use for performance, and where do I actually place the script?, on What GameObject?

var gun : GameObject = (the gun);
var target : Vector3;
var ray : Ray = camera.ViewportPointToRay (Vector3(0.5,0.5,0)); // This is assuming your crosshair is in the middle of the screen
var hit : RaycastHit;
if (Physics.Raycast (ray, hit)) {
 target = hit.point; // We hit something, aim at that
} else {
 target = ray.GetPoint(100); // Distance we're aiming at, could be something else
}
gun.transform.LookAt(hit.point);

And This one:

var hit : RaycastHit;
var Gun : GameObject;
var range = 100.0;
var crosshairTexture: Texture2D;
var position : Rect;

function Start ()

{
  position = Rect ((Screen.width - crosshairTexture.width)/2, (Screen.hight - crosshairTexture.hight)/2 crosshairTexture.width, crosshairTecture.hight);
}

function OnGUI ()
{
  GUI.DrawTexture (position, crosshairTexture);
}

function Update ()

    {
     var ray = camera.ViewportPointToRay       
     (Vector3(0.5,0.5,0));
     Debug.DrawRay (ray.origin, ray.direction *
     range, Color.green);

     var hit : RaycastHit;



     if (Physics.Raycast (ray, hit))
         {Gun.transform.LookAt(hit.point);}
     else
         {Gun.transform.LookAt(GetPoint(range));}
    } 

Would the best solution be to translate a point in the screen to a world point, and then parent the gun's aim and cross-hair element to the mouse's position? Any help would be amazing, thank you so much!

more ▼

asked Mar 12 '10 at 09:40 PM

MikeJ gravatar image

MikeJ
74 4 5 11

(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

One important question is what kind of FPS you are making, since you seem to be kind of describing a duck-hunt type game in which the camera has a fixed position (which would be true if you were to have the crosshair and aim dependent on the mouse position), even though both of the scripts you have fire the gun directly to the middle of the screen.

If you want to do a traditional FPS in which the camera moves with the mouse I would suggest making the crosshair and aiming dependent on the main camera (always being at the middle of the screen), and then having your gun object be a child of the main camera (so that it will move with it). Using the ScreenPointToRay would work for that, you would just need to get a hold of the camera (for instance through a findbytag):

    camera = GameObject.FindWithTag("MainCamera");

Also I wouldn't worry about the performance effects of the raycasts in this case.

more ▼

answered Mar 12 '10 at 10:03 PM

Jason_DB gravatar image

Jason_DB
1.9k 4 14 36

Yeah but I'm having problems figuring out where to actually attach the script to, the camera? the cross-hair gui texture? the gun???

Mar 12 '10 at 10:44 PM MikeJ

I would make a new GameObject a child of the camera and then put the gun script on that. You can put the crosshair anywhere as long as you draw it in the centre of the screen, so it might be easiest to put it in the gun script.

Mar 12 '10 at 11:09 PM Jason_DB

I have a gun as a child of the Main Camera, and I have on that gun a script which controls how it shoots. How do I aim that gun toward the center no matter how close I am to the object. I tried casting the ray directly from the camera instead of the gun, but it still veers off to the right when I get close to the object. I can send you my scene if that helps

Mar 12 '10 at 11:22 PM MikeJ

OK, send it to info@dastardlybanana.com and I'll take a look at it.

Mar 12 '10 at 11:36 PM Jason_DB

Thanks, I sent it off. BTW I saw your video on your site. Very cool, I hope to eventually be to that point.

Mar 12 '10 at 11:48 PM MikeJ
(comments are locked)
10|3000 characters needed characters left

Jason_DB wrote,

I would make a new GameObject a child of the camera and then put the gun script on that. You can put the crosshair anywhere as long as you draw it in the centre of the screen, so it might be easiest to put it in the gun script.

I have no idea why that worked, but it worked like a charm. Earlier, I had tried to put the script on an empty child of the camera and then use that child as the parent of the weapon. That caused the center of the weapon to rotate around the center of the screen. Jason's way caused the weapon to remain fixed on the center of the screen, moving the weapon in a fixed point along with it.

Thanks, Jason. You've saved me a few headaches.

more ▼

answered Nov 08 '12 at 02:22 AM

MP0732 gravatar image

MP0732
44 5 12 25

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x1198
x461
x330
x104
x61

asked: Mar 12 '10 at 09:40 PM

Seen: 5947 times

Last Updated: Nov 08 '12 at 02:23 AM