COMBAT SYSTEMS • WEAPONRY
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);
}
}