---
title: "Tank Creation and Control"
content_type: tutorial
url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial/tutorial/tank-creation-and-control?language=en"
language: en
container_type: course
container_title: "Intermediate 3D Game Development"
container_url: "https://learn.unity.com/course/intermediate-3d-game-development.md?language=en"
unit_title: "Tanks "
unit_url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial?language=en"
standalone_markdown_url: "https://learn.unity.com/tutorial/tank-creation-and-control.md?language=en"
previous_title: "Scene Setup for Tanks"
previous_url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial/tutorial/scene-setup-for-tanks?language=en"
previous_markdown_url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial/tutorial/scene-setup-for-tanks.md?language=en"
next_title: "Camera Control"
next_url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial/tutorial/camera-control?language=en"
next_markdown_url: "https://learn.unity.com/course/intermediate-3d-game-development/unit/tanks-tutorial/tutorial/camera-control.md?language=en"
difficulty: intermediate
duration_minutes: 65
unity_version:
  - "5.x"
supported_unity_versions:
  - name: "5.x"
    url: "https://learn.unity.com/tutorial/tank-creation-and-control.md?language=en&version=5.x"
last_updated: "2026-08-04T14:21:35.000Z"
---

# Tank Creation and Control

Learn how to configure the tank object and implement player controls in the second part of the Tanks project.

This second part of [Unity's Tanks project ](https://learn.unity.com/project/tanks-tutorial)demonstrates how to implement and configure the tank object, and to enable user control.

## Materials

- [Tanks! Tutorial](https://assetstore.unity.com/packages/essentials/tutorial-projects/tanks-tutorial-46209)

## 1. Tank Creation & Control

Phase 2 teaches you how to add the tank artwork and components to let the player control the tank.

[Video](http://www.youtube.com/watch?v=noXtT_zN-84)

**TankMovement Script**

```csharp
using UnityEngine;

public class TankMovement : MonoBehaviour
{
    public int m_PlayerNumber = 1;              // Used to identify which tank belongs to which player.  This is set by this tank's manager.
    public float m_Speed = 12f;                 // How fast the tank moves forward and back.
    public float m_TurnSpeed = 180f;            // How fast the tank turns in degrees per second.
    public AudioSource m_MovementAudio;         // Reference to the audio source used to play engine sounds. NB: different to the shooting audio source.
    public AudioClip m_EngineIdling;            // Audio to play when the tank isn't moving.
    public AudioClip m_EngineDriving;           // Audio to play when the tank is moving.
    public float m_PitchRange = 0.2f;           // The amount by which the pitch of the engine noises can vary.


    private string m_MovementAxisName;          // The name of the input axis for moving forward and back.
    private string m_TurnAxisName;              // The name of the input axis for turning.
    private Rigidbody m_Rigidbody;              // Reference used to move the tank.
    private float m_MovementInputValue;         // The current value of the movement input.
    private float m_TurnInputValue;             // The current value of the turn input.
    private float m_OriginalPitch;              // The pitch of the audio source at the start of the scene.


    private void Awake ()
    {
        m_Rigidbody = GetComponent<Rigidbody> ();
    }


    private void OnEnable ()
    {
        // When the tank is turned on, make sure it's not kinematic.
        m_Rigidbody.isKinematic = false;

        // Also reset the input values.
        m_MovementInputValue = 0f;
        m_TurnInputValue = 0f;
    }


    private void OnDisable ()
    {
        // When the tank is turned off, set it to kinematic so it stops moving.
        m_Rigidbody.isKinematic = true;
    }


    private void Start ()
    {
        // The axes names are based on player number.
        m_MovementAxisName = "Vertical" + m_PlayerNumber;
        m_TurnAxisName = "Horizontal" + m_PlayerNumber;

        // Store the original pitch of the audio source.
        m_OriginalPitch = m_MovementAudio.pitch;
    }


    private void Update ()
    {
        // Store the value of both input axes.
        m_MovementInputValue = Input.GetAxis (m_MovementAxisName);
        m_TurnInputValue = Input.GetAxis (m_TurnAxisName);

        EngineAudio ();
    }


    private void EngineAudio ()
    {
        // If there is no input (the tank is stationary)...
        if (Mathf.Abs (m_MovementInputValue) < 0.1f && Mathf.Abs (m_TurnInputValue) < 0.1f)
        {
            // ... and if the audio source is currently playing the driving clip...
            if (m_MovementAudio.clip == m_EngineDriving)
            {
                // ... change the clip to idling and play it.
                m_MovementAudio.clip = m_EngineIdling;
                m_MovementAudio.pitch = Random.Range (m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
                m_MovementAudio.Play ();
            }
        }
        else
        {
            // Otherwise if the tank is moving and if the idling clip is currently playing...
            if (m_MovementAudio.clip == m_EngineIdling)
            {
                // ... change the clip to driving and play.
                m_MovementAudio.clip = m_EngineDriving;
                m_MovementAudio.pitch = Random.Range(m_OriginalPitch - m_PitchRange, m_OriginalPitch + m_PitchRange);
                m_MovementAudio.Play();
            }
        }
    }


    private void FixedUpdate ()
    {
        // Adjust the rigidbodies position and orientation in FixedUpdate.
        Move ();
        Turn ();
    }


    private void Move ()
    {
        // Create a vector in the direction the tank is facing with a magnitude based on the input, speed and the time between frames.
        Vector3 movement = transform.forward * m_MovementInputValue * m_Speed * Time.deltaTime;

        // Apply this movement to the rigidbody's position.
        m_Rigidbody.MovePosition(m_Rigidbody.position + movement);
    }


    private void Turn ()
    {
        // Determine the number of degrees to be turned based on the input, speed and time between frames.
        float turn = m_TurnInputValue * m_TurnSpeed * Time.deltaTime;

        // Make this into a rotation in the y axis.
        Quaternion turnRotation = Quaternion.Euler (0f, turn, 0f);

        // Apply this rotation to the rigidbody's rotation.
        m_Rigidbody.MoveRotation (m_Rigidbody.rotation * turnRotation);
    }
}
```
