HOW TO CREATE HELICOPTER MOVEMENT IN UNITY

Create smooth, thrilling combat helicopter flight dynamics in Unity with vertical collective lift, directional pitch/roll, and yaw turning.

Quick Answer

In Unity, helicopter movement is built by applying an upward thrust vector (transform.up * liftForce) on a Rigidbody to counteract gravity, tilting the hull forward/backward for pitch and sideways for roll, and rotating around the Y-axis for yaw pedal steering.

Requirements & Setup

Unity Version
2020.3 LTS or Newer
Required Components
Rigidbody + Box/Capsule Collider
Complementary Guide
Weapons System
1

Configure Rigidbody & Center of Mass

Attach a Rigidbody to your helicopter GameObject. Set Mass to 2500 kg, Linear Damping (Drag) to 1.5, and Angular Damping to 2.5 to ensure stable hover behavior.

2

Arcade Helicopter Controller C# Script

HelicopterController.cs (C#)
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]
public class HelicopterController : MonoBehaviour
{
    [Header("Engine & Lift (Collective)")]
    [SerializeField] private float maxLiftForce = 45f;
    [SerializeField] private float hoverForce = 9.81f; // Counter gravity

    [Header("Directional Movement (Cyclic)")]
    [SerializeField] private float forwardSpeed = 20f;
    [SerializeField] private float strafeSpeed = 15f;
    [SerializeField] private float tiltAngle = 25f;
    [SerializeField] private float tiltSmoothSpeed = 4f;

    [Header("Yaw Steering (Rudder Pedals)")]
    [SerializeField] private float turnSpeed = 60f;

    [Header("Visual Mesh to Tilt")]
    [SerializeField] private Transform visualHull;

    private Rigidbody rb;
    private float liftInput;
    private float pitchInput;
    private float rollInput;
    private float yawInput;

    private void Awake()
    {
        rb = GetComponent<Rigidbody>();
        rb.useGravity = true;
    }

    private void Update()
    {
        // Collective: Shift (Up) / Ctrl (Down) or Space/C
        liftInput = Input.GetAxisRaw("Jump") - (Input.GetKey(KeyCode.LeftControl) ? 1f : 0f);

        // Cyclic Pitch & Roll: WASD
        pitchInput = Input.GetAxis("Vertical");
        rollInput = Input.GetAxis("Horizontal");

        // Yaw: Q and E keys
        yawInput = 0f;
        if (Input.GetKey(KeyCode.Q)) yawInput -= 1f;
        if (Input.GetKey(KeyCode.E)) yawInput += 1f;

        AnimateVisualTilt();
    }

    private void FixedUpdate()
    {
        ApplyLift();
        ApplyDirectionalThrust();
        ApplyYawRotation();
    }

    private void ApplyLift()
    {
        // Counteract standard gravity while providing additional climb/descend power
        float totalLift = (Physics.gravity.magnitude + (liftInput * maxLiftForce));
        Vector3 liftVector = Vector3.up * (totalLift * rb.mass);
        rb.AddForce(liftVector, ForceMode.Force);
    }

    private void ApplyDirectionalThrust()
    {
        Vector3 forwardThrust = transform.forward * (pitchInput * forwardSpeed);
        Vector3 lateralThrust = transform.right * (rollInput * strafeSpeed);

        rb.AddForce(forwardThrust + lateralThrust, ForceMode.Acceleration);
    }

    private void ApplyYawRotation()
    {
        float yawAmount = yawInput * turnSpeed * Time.fixedDeltaTime;
        Quaternion yawRotation = Quaternion.Euler(0f, yawAmount, 0f);
        rb.MoveRotation(rb.rotation * yawRotation);
    }

    private void AnimateVisualTilt()
    {
        if (visualHull == null) return;

        // Visual banking without altering the core physics orientation
        float targetPitch = pitchInput * tiltAngle;
        float targetRoll = -rollInput * tiltAngle;

        Quaternion targetRotation = Quaternion.Euler(targetPitch, visualHull.localEulerAngles.y, targetRoll);
        visualHull.localRotation = Quaternion.Slerp(visualHull.localRotation, targetRotation, Time.deltaTime * tiltSmoothSpeed);
    }
}
3

Visual Hull vs Physics Rigidbody Separation

A key technique in professional flight games like Operation Black Sky is separating the visual 3D helicopter mesh child from the main physics root GameObject. This allows you to tilt the hull aggressively for arcade visual juice (using Quaternion.Slerp) without causing the physics colliders to flip or glitch into terrain.

Next Up in Flight Systems

Frequently Asked Questions

Set the Rigidbody Linear Damping (Drag) to at least 1.2 - 2.0. When input ceases, air friction will naturally bring horizontal velocity back to zero.