Quick Start Guide to Unity C# Scripting for Beginners

tutorialgame-audio-unityscripting

Enough C# to read and modify a Unity game’s scripts — which is what a composer needs to wire FMOD events into a project someone else built. This guide covers setting up the editor, C# syntax and conventions, the MonoBehaviour lifecycle, variables, Unity’s execution order, moving objects and reading input, and debugging. If you have never programmed, start here before Basic Audio Scripting in Unity with C#.

Prerequisites

  • Unity Installed: Download and install the latest version of Unity from the official website.
  • Basic Computer Skills: Familiarity with using a computer and navigating software interfaces.

Setting Up Your Environment

  1. Open Unity Hub and create a new project:
    • Click on “New Project”.
    • Choose the “3D Core” template.
    • Name your project (e.g., “MyFirstGame”) and select a location to save it.
    • Click “Create”.
  2. Unity Interface Overview:
    • Scene View: Where you build your game environment.
    • Game View: Previews your game as the player would see it.
    • Hierarchy: Lists all game objects in the current scene.
    • Inspector: Displays and allows editing of selected object’s properties.
    • Project Window: Shows all assets in your project.
  3. Set Up Your Code Editor:
    • Unity uses Visual Studio or Visual Studio Code by default.
    • Ensure you have one of these installed.
    • In Unity, go to Edit > Preferences > External Tools and select your preferred code editor.

Understanding C# Basics

C# (pronounced “C Sharp”) is a modern, object-oriented programming language developed by Microsoft. In Unity, C# scripts are used to write gameplay mechanics, control object behaviors, and implement game logic.

Key Concepts

  • Variables: Store data values.
  • Functions (Methods): Perform actions.
  • Classes: Blueprints for creating objects.
  • Objects: Instances of classes.
  • Inheritance: Mechanism where one class acquires properties of another.

Syntax and Formatting

Understanding the syntax and formatting of C# is crucial for writing clear and error-free code. Proper syntax ensures that your code is understood by the compiler, while consistent formatting makes your code easier to read and maintain.

Basic Syntax Rules

  1. Case Sensitivity:

    • C# is case-sensitive. For example, Variable, variable, and VARIABLE are all distinct identifiers.
  2. Statements and Semicolons:

    • Each statement ends with a semicolon (;).

    • Example:

      int score = 0;
      score += 10;
      
  3. Braces {}:

    • Braces define the beginning and end of code blocks, such as classes, methods, and loops.

    • Properly matching braces is essential to avoid syntax errors.

    • Example:

      public class Player
      {
          void Move()
          {
              // Movement code here
          }
      }
      
  4. Indentation and Whitespace:

    • Use consistent indentation (commonly 4 spaces) to enhance readability.

    • Indentation helps visualize the structure of your code.

    • Example:

      if (score > 10)
      {
          Debug.Log("High score!");
      }
      
  5. Comments:

    • Use comments to explain and document your code. They are ignored by the compiler.

    • Single-line comments: Start with //.

      // This is a single-line comment
      
    • Multi-line comments: Enclosed between /* and /.

      /*
       * This is a multi-line comment.
       * It can span multiple lines.
       */
      

Naming Conventions

Adhering to standard naming conventions improves code readability and maintainability.

  1. PascalCase:

    • Used for class names, method names, and properties.

    • Example:

      public class PlayerController
      {
          public void MovePlayer()
          {
              // Method code
          }
      }
      
  2. camelCase:

    • Used for variable names and parameters.

    • Example:

      public float playerSpeed = 5.0f;
      
  3. UPPERCASE:

    • Often used for constants.

    • Example:

      public const int MAX_HEALTH = 100;
      

Common Formatting Practices

  1. Consistent Bracing Style:

    • Place opening braces on the same line as the declaration.

      public void Jump()
      {
          // Jump code
      }
      
  2. Spacing:

    • Use spaces around operators and after commas for clarity.

      float speed = 5.0f;
      Vector3 direction = new Vector3(x, y, z);
      
  3. Line Length:

    • Keep lines reasonably short (typically under 100 characters) to enhance readability.
  4. Organizing Code:

    • Group related code together and separate different sections with blank lines.
    • For example, place all variable declarations at the top of the class, followed by methods.

Example of Well-Formatted Code

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Public variables visible in the Inspector
    public float speed = 5.0f;
    public string playerName = "Alex";

    // Private variables
    private int score = 0;
    private bool isJumping = false;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log(playerName + " has entered the game.");
    }

    // Update is called once per frame
    void Update()
    {
        HandleMovement();
        HandleJump();
    }

    // Method to handle player movement
    void HandleMovement()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");

        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        transform.Translate(movement * speed * Time.deltaTime);
    }

    // Method to handle player jumping
    void HandleJump()
    {
        if (Input.GetKeyDown(KeyCode.Space) && !isJumping)
        {
            isJumping = true;
            // Add jump logic here
            Debug.Log("Player jumped!");
        }
    }
}

Creating Your First Script

  1. Create a Script File:
    • In the Project Window, navigate to the “Assets” folder.
    • Right-click and select Create > C# Script.
    • Name the script (e.g., “PlayerController”).
  2. Attach the Script to a GameObject:
    • In the Hierarchy, create a new Cube: GameObject > 3D Object > Cube.
    • Select the Cube in the Hierarchy.
    • Drag and drop the PlayerController script onto the Cube in the Inspector.
  3. Open the Script:
    • Double-click the PlayerController script to open it in your code editor.

Exploring the MonoBehaviour Class

In Unity, scripts inherit from the MonoBehaviour class, which provides fundamental methods and properties.

Default Script Structure

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        // Initialization code here
    }

    // Update is called once per frame
    void Update()
    {
        // Frame-by-frame logic here
    }
}
  • Start(): Called once before the first frame.
  • Update(): Called once per frame.

Working with Variables and Data Types

Common Data Types

  • int: Integer numbers (e.g., int score = 0;)
  • float: Floating-point numbers (e.g., float speed = 5.5f;)
  • bool: Boolean values (true or false)
  • string: Text (e.g., string playerName = "Alex";)

Example

public class PlayerController : MonoBehaviour
{
    public float speed = 5.0f; // Public variable, editable in the Inspector

    void Start()
    {
        // Initialization code
    }

    void Update()
    {
        // Movement code
    }
}

Understanding Unity’s Execution Order

  • Awake(): Called when the script instance is being loaded.
  • Start(): Called before the first frame update.
  • Update(): Called once per frame.
  • FixedUpdate(): Called at fixed intervals, suitable for physics calculations.
  • LateUpdate(): Called after all Update functions have been called.

Manipulating GameObjects

Moving a GameObject

void Update()
{
    // Move the object forward constantly at speed 5
    transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
  • transform: Reference to the object’s Transform component.
  • Translate(): Moves the object in space.
  • Vector3.forward: Represents the forward direction (z-axis).
  • Time.deltaTime: Time elapsed since the last frame, used to make movement smooth across different frame rates.

Responding to User Input

void Update()
{
    float moveHorizontal = Input.GetAxis("Horizontal");
    float moveVertical = Input.GetAxis("Vertical");

    Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);

    transform.Translate(movement * speed * Time.deltaTime);
}
  • Input.GetAxis(): Gets input from the keyboard or controller.
  • “Horizontal” and “Vertical”: Default input axes for horizontal (A/D or Left/Right arrows) and vertical movement (W/S or Up/Down arrows).

Debugging and Testing

Using Debug.Log()

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Debug.Log("Space key was pressed.");
    }
}
  • Debug.Log(): Prints messages to the Unity Console for debugging purposes.
  • Input.GetKeyDown(): Detects if a specific key was pressed during the frame.

Checking for Errors

  • Console Window: Displays errors, warnings, and debug messages.
  • Double-click error messages to navigate to the problematic line in your code.

Next Steps

Conclusion

You don’t need to become a programmer to work in game audio, but you do need to read a script, find the moment a sound should happen, and add a line there without breaking anything. Everything in this guide serves that: knowing what a MonoBehaviour is, where Start() and Update() run, how a variable is declared, and how to check the Console when something goes wrong.