How to Create Homing Missiles in Unity

Published July 01, 2018 by Hiren Namara, posted by Vivek Tank
Do you see issues with this article? Let us know.
Advertisement

This article provides a brief introduction to creating Homing Missiles in a 2D game. A Homing Missile is a missile that locks onto and chases a target until it reaches the target and explodes. We'll be using the Unity engine, and a script for the Homing missile is also included and explained in the article.

Scene Setup

  1. Create two 2D Objects named “Missile ” and “Target”
  2. Add a sprite to these 2D Objects (You can download the project from below link)
  3. Add rigidBody 2D in missile and add Script also name it as ”Homing Missile”

Implementation

To implement a basic homing missile we could use MoveToward/Lerp until the missile reaches its target.

working-of-homing-missile.thumb.png.0a8fea8e4db1cd6c3934074ecb967024.png

Using MoveToward/Lerp, the missiong will reach the target properly, but its movement will be very linear - there is no feel of a homing missile.

To implement a better feel, we need to simulate with better physics. Let's walk through a solution:


    public class HomingMissile : MonoBehaviour
    {
        public Transform target;
        public Rigidbody2D rigidBody;
        public float angleChangingSpeed;
        public float movementSpeed;
      
        void FixedUpdate()
        {
            Vector2 direction = (Vector2)target.position - rb.position;
            direction.Normalize ();
            float rotateAmount = Vector3.Cross (direction, transform.up).z;
            rigidBody.angularVelocity = -angleChangingSpeed * rotateAmount;
            rigidBody.velocity = transform.up * movementSpeed;
        }
    }

Variables

  • rigidBody: rigidBody of the missile to add velocity and change angle.
  • target: To get the position of the Target.
  • angleChangingSpeed: The speed to change the angle
  • movementSpeed: Speed of movement

The Math

Here is a visualization of the path our homing missile needs to take on a moving target.

actual-path-of-homing-missile.png.41be56328c62d1be321d2be11d604e8d.png

Let's talk about how to implement this.

First, you need “Direction”.

Step 1

We subtract the two vectors, targetPosition and missilePosition to get the direction.


direction= targetPosition (target.position) - missilePosition(rb.position);

vector-substraction.png.1c8b1fd2c8ec0837710a652d869adcff.png

Step 2

We convert the direction vector to a unit vector through normalization.


direction.Normalize();

Step 3

Calculate the rotation vector. The rotation vector will be the cross product of our direction vector and our missile's up vector. The rotation vector will be the z-axis of the cross product.

In the diagram below the blue arrow is our direction, the red arrow is the up vector of our missile's transform, and the green arrow is our resulting z-axis component of the cross product between direction and up.

vector-cross-product.gif


float rotateAmount=Vector3.Cross(direction,transform.up).z;

Step 4

Next, we change the angularVelocity of the missile's rigidBody to control the orientation of our missile. We use an angleChangingSpeed factor to control the speed of rotation.


rb.angularVelocity = -angleChangingSpeed * rotationAmount

Step 5

And finally we add velocity to our rigidBody, which controls the translation of our missile in the environment. 


rb.velocity = tranform.up * movementSpeed

But wait...

We aren't done yet. In the code above we have two movement factors that need to be balanced: angleChangingSpeed and movementSpeed.

missile-heading-to-the-target.png.0e57cdc81fd2267a974ad1b78df9c283.png

In the above Image, the missile is moving toward the target, there is no problem here.

velocity-force-vs-angular-velocity.png.0daafa2818fbe37ff50b079dc7b3e854.png

However, in this image we have one tick of the simulation and the target has moved to a new position. The missile is oriented toward the target due to angular velocity (red), but it continues to move toward the target's previous position due to its velocity (black).

velocity-force-vs-angular-velocity-2.png.6de28c58312f7302b6a5cc38fd6979cd.png

As we can see, the missile's velocity moves it behind the target (black) while the angular velocity (red) tries to pull the missile to the target.

orbit-dead-loop.png.1b6000ad44ab9086c6fb4b9fa2570bdd.png

This can result in the missile falling into a stable orbit around the target and never reaching its goal. We can balance this with the angleChangingSpeed and movementSpeed parameters.

There is no particular formula to balance these parameters. The necessary parameters will depend on your gameplay and game design.

Be careful with extremes for movementSpeed, positive or negative. Too slow and your missiles won't feel like homing missiles, and too fast will lead to them being trapped in orbit.

Same with angleChangingSpeed. Too small it will be in orbit, and too high you will lose the feel of homing missiles.

I hope this article has been useful and hope to see homing missiles in your game!

real-life-exsmple-homing-missile.png

 

[Wayback machine archived copy]

Cancel Save
4 Likes 0 Comments

Comments

Nobody has left a comment. You can be the first!
You must log in to join the conversation.
Don't have a GameDev.net account? Sign up!

The main objective of this post is to give a brief introduction to Homing Missiles in Game (2D). A script for Homing missile is also included and explained in the article.

Advertisement

Other Tutorials by Vivek Tank

Vivek Tank has not posted any other tutorials. Encourage them to write more!
Advertisement