Spaceship Controller in Unity

In this tutorial, I will show how to make a spaceship controller in Unity.

Let's begin!

Steps

  • Create a new GameObject, call it "Spaceship"
  • Move the Spaceship model inside the "Spaceship" object and change its position to (0, 0, 0)
  • Create a new script, call it "SC_SpaceshipController" and paste the code below inside it:

SC_SpaceshipController.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody))]

public class SC_SpaceshipController : MonoBehaviour
{
    public float normalSpeed = 25f;
    public float accelerationSpeed = 45f;
    public Transform cameraPosition;
    public Camera mainCamera;
    public Transform spaceshipRoot;
    public float rotationSpeed = 2.0f;
    public float cameraSmooth = 4f;
    public RectTransform crosshairTexture;

    float speed;
    Rigidbody r;
    Quaternion lookRotation;
    float rotationZ = 0;
    float mouseXSmooth = 0;
    float mouseYSmooth = 0;
    Vector3 defaultShipRotation;

    // Start is called before the first frame update
    void Start()
    {
        r = GetComponent<Rigidbody>();
        r.useGravity = false;
        lookRotation = transform.rotation;
        defaultShipRotation = spaceshipRoot.localEulerAngles;
        rotationZ = defaultShipRotation.z;

        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    void FixedUpdate()
    {
        //Press Right Mouse Button to accelerate
        if (Input.GetMouseButton(1))
        {
            speed = Mathf.Lerp(speed, accelerationSpeed, Time.deltaTime * 3);
        }
        else
        {
            speed = Mathf.Lerp(speed, normalSpeed, Time.deltaTime * 10);
        }

        //Set moveDirection to the vertical axis (up and down keys) * speed
        Vector3 moveDirection = new Vector3(0, 0, speed);
        //Transform the vector3 to local space
        moveDirection = transform.TransformDirection(moveDirection);
        //Set the velocity, so you can move
        r.velocity = new Vector3(moveDirection.x, moveDirection.y, moveDirection.z);

        //Camera follow
        mainCamera.transform.position = Vector3.Lerp(mainCamera.transform.position, cameraPosition.position, Time.deltaTime * cameraSmooth);
        mainCamera.transform.rotation = Quaternion.Lerp(mainCamera.transform.rotation, cameraPosition.rotation, Time.deltaTime * cameraSmooth);

        //Rotation
        float rotationZTmp = 0;
        if (Input.GetKey(KeyCode.A))
        {
            rotationZTmp = 1;
        }
        else if (Input.GetKey(KeyCode.D))
        {
            rotationZTmp = -1;
        }
        mouseXSmooth = Mathf.Lerp(mouseXSmooth, Input.GetAxis("Mouse X") * rotationSpeed, Time.deltaTime * cameraSmooth);
        mouseYSmooth = Mathf.Lerp(mouseYSmooth, Input.GetAxis("Mouse Y") * rotationSpeed, Time.deltaTime * cameraSmooth);
        Quaternion localRotation = Quaternion.Euler(-mouseYSmooth, mouseXSmooth, rotationZTmp * rotationSpeed);
        lookRotation = lookRotation * localRotation;
        transform.rotation = lookRotation;
        rotationZ -= mouseXSmooth;
        rotationZ = Mathf.Clamp(rotationZ, -45, 45);
        spaceshipRoot.transform.localEulerAngles = new Vector3(defaultShipRotation.x, defaultShipRotation.y, rotationZ);
        rotationZ = Mathf.Lerp(rotationZ, defaultShipRotation.z, Time.deltaTime * cameraSmooth);

        //Update crosshair texture
        if (crosshairTexture)
        {
            crosshairTexture.position = mainCamera.WorldToScreenPoint(transform.position + transform.forward * 100);
        }
    }
}
  • Attach the SC_SpaceshipController script to the "Spaceship" object
  • Create a new GameObject, call it "CameraPosition" and move it inside the "Spaceship" object
  • Move the Main Camera inside the "CameraPosition" object and change its position to (0, 0, 0)
  • Tweak the "CameraPosition" object position until you are happy with the result

  • Move the Main Camera outside of the "Spaceship" object
  • In SC_SpaceshipController assign Camera Position, Main Camera, and Spaceship Root (this should be a transform of a spaceship model) variables

  • Create a new UI Canvas (GameObject -> UI -> Canvas)
  • Right-click on Canvas object -> UI -> Image
  • Change the alignment of a new image to the top-left

  • Assign the sprite below to the image

sci-fi crosshair

  • Finally, assign the newly created image to Crosshair Texture in SC_SpaceshipController

The Spaceship controller is ready. Use the mouse to look around, A/D to rotate along the Z-axis, and Right Mouse Button to accelerate.

Suggested Articles
Helicopter Controller for Unity
Adding Double Jump Support to a 2D Platformer Character Controller in Unity
How to Make Crane Control in Unity
Car Controller for Unity
Character Controller How to Add Ability to Push Rigidbodies in Unity
Airplane Controller for Unity
Implementing Parkour System in Unity