- Home /
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;
}
Answer by Jason Mathews · Mar 07, 2010 at 10:49 PM
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));
}
}
Answer by StephanK · Mar 05, 2010 at 09:20 AM
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".
Hmm still seams to fire towards the camera ins$$anonymous$$d... This was similar to what I first thought about.
$$anonymous$$aybe then you should just change the sign of the direction...?
Answer by cregox · Mar 05, 2010 at 06:45 PM
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.
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.
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.
@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. ;)
Answer by Ricardo · Mar 07, 2010 at 11:07 PM
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.