HOW TO CREATE A MISSILE SYSTEM IN UNITY

Program air-to-air guided homing missiles featuring smooth target intercept tracking, rocket smoke particle trails, and area-of-effect blast damage.

Homing Intercept Formula

A guided missile points its nose towards the target using Quaternion.RotateTowards(transform.rotation, Quaternion.LookRotation(target.position - transform.position), turnRate * Time.deltaTime) while constantly accelerating forward along transform.forward.

1

Guided Homing Missile C# Script

HomingMissile.cs (C#)
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class HomingMissile : MonoBehaviour
{
    [Header("Flight Dynamics")]
    [SerializeField] private float speed = 55f;
    [SerializeField] private float turnRate = 120f; // deg/sec
    [SerializeField] private float fuseLifetime = 6f;

    [Header("Explosion & Damage")]
    [SerializeField] private float blastRadius = 6f;
    [SerializeField] private float maxDamage = 120f;
    [SerializeField] private GameObject explosionPrefab;
    [SerializeField] private LayerMask damageableLayers;

    private Transform target;
    private Rigidbody rb;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = false;
        Destroy(gameObject, fuseLifetime); // Failsafe detonation
    }

    public void Launch(Transform targetTransform, Vector3 initialVelocity)
    {
        target = targetTransform;
        rb.linearVelocity = initialVelocity + (transform.forward * 10f);
    }

    private void FixedUpdate()
    {
        if (target != null)
        {
            Vector3 targetDir = (target.position - transform.position).normalized;
            Quaternion targetRotation = Quaternion.LookRotation(targetDir);
            
            // Steer missile smoothly towards target
            transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, turnRate * Time.fixedDeltaTime);
        }

        // Propel forward
        rb.linearVelocity = transform.forward * speed;
    }

    private void OnTriggerEnter(Collider other)
    {
        Detonate();
    }

    private void OnCollisionEnter(Collision collision)
    {
        Detonate();
    }

    private void Detonate()
    {
        if (explosionPrefab != null)
        {
            Instantiate(explosionPrefab, transform.position, Quaternion.identity);
        }

        // Apply Area-of-Effect Damage
        Collider[] hits = Physics.OverlapSphere(transform.position, blastRadius, damageableLayers);
        foreach (Collider hit in hits)
        {
            float distance = Vector3.Distance(transform.position, hit.transform.position);
            float damagePercent = 1f - Mathf.Clamp01(distance / blastRadius);
            float appliedDamage = maxDamage * damagePercent;

            // Send damage to target component (e.g. HealthSystem)
            hit.SendMessage("TakeDamage", appliedDamage, SendMessageOptions.DontRequireReceiver);
        }

        Destroy(gameObject);
    }
}

Calculate Damage & Trajectories