x


Lock On Projectile

So what I want to do is, create a projectile and fire it at a specific target. We are creating a 3rd Person RPG and spells and such fly at the target. As it is we have the targeting down but I am having problems getting the projectile to fire from "Player" to the "Target". For some reason i just can't think 3D and how to get the math to move from Player to Target.

Any help would be wonderful.

//test attack
if (GUI.Button (Rect (50, 200, 25, 25), "Attack")){
    var instantiatedProjectile : Rigidbody = Instantiate (projectile, PC.transform.position, PC.transform.rotation);
    instantiatedProjectile.velocity = PC.transform.TransformDirection(Vector3(0, 0, 0));
    Physics.IgnoreCollision (instantiatedProjectile.collider, PC.transform.root.collider);

    targobject.GetComponent("Targetable").Life = targlife - 2;
    targobject.GetComponent("Targetable").targeted = true;
}
more ▼

asked Mar 05 '10 at 04:39 AM

Jason Mathews gravatar image

Jason Mathews
129 6 7 14

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

4 answers: sort voted first

Ok so after a bit of looking around and working I came across LookAt, which seemed to solve the issue. I mean the projectile fires straight, but needs to fire at the target when first done. Here's what I did

if (GUI.Button (Rect (50, 200, 50, 25), PC.GetComponent("Attributes").Spell)){
    if (target != "None"){
        PC.GetComponent("Attributes").SpellDamage = 2;
        PC.transform.LookAt(targobject.transform);
        var instantiatedProjectile : Rigidbody = Instantiate(projectile, PC.transform.position, PC.transform.rotation );
        Physics.IgnoreCollision( instantiatedProjectile.collider,PC.transform.root.collider );
        instantiatedProjectile.velocity = PC.transform.TransformDirection(Vector3(0,0,speed));
    }
}
more ▼

answered Mar 07 '10 at 10:49 PM

Jason Mathews gravatar image

Jason Mathews
129 6 7 14

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

You can get the direction to your target by doing this:

Vector3 direction = target.transform.position - player.transform.position;

Then all you need to do is move the projectile in "direction".

more ▼

answered Mar 05 '10 at 09:20 AM

StephanK gravatar image

StephanK
6k 39 53 93

Hmm still seams to fire towards the camera instead... This was similar to what I first thought about.

Mar 05 '10 at 03:33 PM Jason Mathews

Maybe then you should just change the sign of the direction...?

Mar 05 '10 at 09:46 PM StephanK
(comments are locked)
10|3000 characters needed characters left

Well, @spree gave you the way. But since you didn't get it, allow me to try and guide you through this path.

I hope you're using javascript. And I'm assuming your only issue here is making the projectile move towards the target. Also assuming you'll use the following lines inside some Player's script.

private var targobject : GameObject;
var projectileVelocity : float = 90.0;

function FireProjectile () {
    var instantiatedProjectile : Rigidbody = Instantiate (projectile, PC.transform.position, PC.transform.rotation);
    Physics.IgnoreCollision (instantiatedProjectile.collider, PC.transform.root.collider);
    var targobjectDirection : Vector3 = targobject.transform.position - transform.position;
    instantiatedProjectile.velocity = targobjectDirection * projectileVelocity;

    targobject.GetComponent("Targetable").Life = targlife - 2;
    targobject.GetComponent("Targetable").targeted = true;
}

targobject must be set somewhere else, inside some script somehow. I've set it as 90 because I guess bullets go at 900 m/s and that would be too fast on Unity.

projectileVelocity is an arbitrary number set on Inspector.

FireProjectile should be called just once per projectile.

It will fire pointed to the target, but it will not follow it. For that, you'd need to write a second script and run it on Update. It could be done on that same script and it would be some more work. Keep in mind that doing an auto-follow with physics, at other hand, will require a lot more of work, and is most likely not needed - there's nothing much physical about such a projectile following a target.

I haven't tested this, so it might need some adjustments, but that's the basic idea.

more ▼

answered Mar 05 '10 at 06:45 PM

Cawas gravatar image

Cawas
1.3k 31 38 54

Perhaps adding an example of what is going on. http://www.meidigitaldesigns.com/DWTargeting.html

Basically if you click on the box it targets it, the targeting screen updates with the name and HP. If you hit attack then the bolt fire and the HP go down. Now its just getting the bolt from the player to the box.

But this does help me, still getting used to 3D space for calling scripts.

Mar 06 '10 at 01:33 AM Jason Mathews

I was thinking about this, if we just set it to move forward on the Z then all we need to do is change the rotation to face the target, and that would accomplish what I kind of want here. The question then would be how do we find the rotation that would put the Z facing our object.

Mar 06 '10 at 08:11 PM Jason Mathews

@Jason sorry I somehow missed your comments - I wasn't notified about them... Dam I hate StackExchange notification system so much! Well, I'm glad to know this helped you. You should just accept your own answer if it solved your question. ;)

Mar 12 '10 at 02:39 PM Cawas
(comments are locked)
10|3000 characters needed characters left

Or you could just use the UnitySteer functions, particularly steerForPursuit, exemplified on the MpPursuer vehicle and its corresponding PursuerBehavior. Depending on your needs, it's possible that said behavior will require only minimal modification.

more ▼

answered Mar 07 '10 at 11:07 PM

Ricardo gravatar image

Ricardo
5.2k 20 32 96

(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:

x1866
x253
x48

asked: Mar 05 '10 at 04:39 AM

Seen: 2588 times

Last Updated: Mar 07 '10 at 11:04 PM