Setting up the player’s movement controls.

In this tutorial we’ll do the basic player setup and create a schematic to control the player. Roguelikes are turn based, i.e. the player will only be able to move when it’s his turn – this will be handled using game states. You can learn more about game states in this how-to.

Setting Player Schematic

First, we’ll use a schematic to set the player when the level starts and add it using an Auto Machine component. Select the Player game object in the scene view.

Follow the steps in this schematic tutorial – it explains how to create the schematic and add an auto machine to the game object.

Player Control: Schematic

The player can only move one tile per turn, either vertically or horizontally. Before moving, we need to check if there’s something on that tile blocking our way (and try to chip through it if possible).

Open the Makinom editor, navigate to Schematics and create a new schematic. Change the following settings.

Player Control Schematic

Settings

We’ll add an audio clip resource to play a random move sound effect.

Audio Clips

Click on Add Audio Clip Resource to add an audio clip resource.

  • Name
    Set to Move.
  • Use Order
    Select Random.

We need 2 audio clips, add the needed amount by clicking on Add Audio Clip.

  • Audio Clip
    Select scavengers_footstep1 and scavengers_footstep2.
    The audio clips can be found at Assets/Tutorial Resources/Audio/.

Input Key

Add > Input > Input Key

This node is used to check if input keys are used – the first used input in the list will execute the node connected to it’s slot. We’ll use it to check if the player pressed the Vertical or Horizontal keys.

  • Input Key
    Select Horizontal.

Click on Add Input Key to add another input.

  • Input Key
    Select Vertical.

Change Variables

Add > Value > Variable > Change Variables

We’ll use this node to set the direction we’ll be moving into when moving horizontally. This node is connected to the Horizontal slot of the Input Key node.

Click on Add Variable to add a variable change.

  • Change Type
    Select Variable.
  • Variable Key
    Set to direction.
  • Variable Origin
    Select Local.
  • Type
    Select Vector3.
  • Operator
    Select Set.
  • Normalize
    Enable this setting.
  • Vector3 Type
    Select Set Axis.

The X-axis will use the input from the Horizontal input key.

  • X-Axis
    Select Input Key Axis and Horizontal.

The Y and Z-axis will just be 0.

  • Y-Axis, Z-Axis
    Set to 0 (Value).

Change Variables

Add > Value > Variable > Change Variables

We’ll use this node to set the direction we’ll be moving into when moving vertically. This node is connected to the Vertical slot of the Input Key node.

Click on Add Variable to add a variable change.

  • Change Type
    Select Variable.
  • Variable Key
    Set to direction.
  • Variable Origin
    Select Local.
  • Type
    Select Vector3.
  • Operator
    Select Set.
  • Normalize
    Enable this setting.
  • Vector3 Type
    Select Set Axis.

The Y-axis will use the input from the Vertical input key.

  • Y-Axis
    Select Input Key Axis and Vertical.

The X and Z-axis will just be 0.

  • X-Axis, Z-Axis
    Set to 0 (Value).

Raycast

Add > Game Object > Raycast > Raycast

This node is used to send a raycast into the scene. We’ll use it to check if something is on the tile we’re moving to.

We will store the game object we’ve hit with the raycast.

Raycast Settings

  • Raycast Origin
    Select Game Object.
  • Distance
    Set to 1.
  • Layer Mask
    Select BlockingLayer.
    To only select the BlockingLayer layer, select Nothing first.
  • Object
    Select Machine Object.
  • Vector3 Type (Direction)
    Select Vector3 Variable.
  • Variable Key
    Set to direction.
  • Variable Origin
    Select Local.

We need to make sure that the player isn’t found by the raycast, so we’ll use Filter Game Objects.

  • Use Filter
    Enable this setting.

Click on Add Excluded Object to add a game object that will be ignored by the raycast.

  • Object
    Select Machine Object.

Hit Game Object

We want the game object that was hit to be used as Selected Data in order to use it in the following nodes.

  • Use Hit Object
    Select Selected Data.
  • Data Key
    Set to hitObject.
  • Data Origin
    Select Local.
  • Change Type
    Select Set.

Start Tagged Machine

Add > Machine > Start Tagged Machine

We’ll use this node to start a tagged machine with the tag wall on the game object that was hit by the raycast. This will reduce the health of walls and remove them from the game – we’ll set this up in later schematics. The damage the player does to the wall is stored in a global variable (see first steps).

This node is connected to the Success slot of the Raycast node – i.e. when we’re blocked by something.

  • Share Local Variables
    Disable this setting.
  • Wait
    Enable this setting.

Machine Object

  • Object
    Select Selected Data.
  • Data Key
    Set to hitObject.
  • Data Origin
    Select Local.

Starting Object

  • Object
    Select Machine Object.

Tag Settings

Click on Add Tag to add a starting tag.

  • Tag
    Set to wall.

Play Sound

Add > Animation + Audio > Audio > Play Sound

This node is used to play audio clips. We’ll use it to play the movement sound with a random pitch.

This node is connected to the Failed slot of the Raycast node – i.e. when we’re moving.

Play On

  • Object
    Select Machine Object.

Audio Settings

  • Audio Clip
    Select 0: Move.
  • Play One Shot
    Enable this setting.
  • Volume
    Set to 1.
  • Set Pitch
    Enable this setting.
  • Random Pitch
    Enable this setting.
  • Pitch
    Set to 0.95.
  • Pitch 2
    Set to 1.05.

Change Position

Add > Movement > Movement > Change Position

This node is used to change or fade the position of a game object. We’ll use it to move the player (fading) on the next tile.

Moving Object

  • Object
    Select Machine Object.
  • Move Component
    Select Rigidbody 2D.
  • Move Function
    Select Move Position.

Target Position

  • To Object
    Disable this setting.

Position

  • Vector3 Type
    Select Vector3 Variable.
  • Variable Key
    Set to direction.
  • Variable Origin
    Select Local.
  • Local Position
    Enable this setting.
    We’ll use the direction we’ve set using the input keys as an offset to the current position of the player.

Move Settings

  • Move
    Enable this setting.
  • Wait
    Enable this setting.
  • Apply Gravity
    Disable this setting.
  • Move By Speed
    Disable this setting.
  • Time (s)
    Set to 0.1.

Change Variables

Add > Value > Variable > Change Variables

We’ll use this node to reduce the player’s food by 1. The food is stored in a global variable.

This node is connected to the Next slots of the Start Tagged Machine (hitting walls) and Change Position nodes – i.e. both moving and being blocked by something costs food.

Click on Add Variable to add a variable change.

  • Change Type
    Select Variable.
  • Variable Key
    Set to food.
  • Variable Origin
    Select Global.
  • Type
    Select Int.
  • Operator
    Select Sub.
  • Float Value
    Set to 1 (Value).

Start Tagged Machine

Add > Machine > Start Tagged Machine

We’ve reduced the player’s food – now we need to check if all food is gone, i.e. game over.

Checking for game over will be handled by another schematic – we’ll set it up later, so for now we only try to start it’s tagged machine.

  • Share Local Variables
    Disable this setting.
  • Wait
    Disable this setting.

Machine Object

  • Object
    Select Machine Object.

Starting Object

  • Object
    Select Machine Object.

Tag Settings

Click on Add Tag to add a starting tag.

  • Tag
    Set to checkGameOver.

Change Game State

Add > Game > Game > Change Game State

We’ll use this node to end the player’s move by inactivating the In Control game state.

Click on Add Game State to add a game state change.

  • Game State
    Select In Control.
  • Set State
    Select Inactive.

That’s it for the schematic – click on Save Schematic and save it as PlayerControl in Assets/Schematics/.

Player Control: Tick Machine

The schematic handling the player’s control will try to start each frame, but will only be able to when the player is in control (and the game is running). This allows us to set up the turn based gameplay.

Add a tick machine component to the Player game object (e.g. using the component menu: Makinom > Machines > Tick Machine) and change the following settings.

Start Settings

  • Update
    Enable this setting.
  • Check Game States
    Enable this setting.
  • Needed
    Select All.

Click on Add Game State to add a game state condition.

  • Condition Type
    Select Game State.
  • Game State
    Select In Control.
  • Check State
    Select Active.

Click on Add Game State again to add another condition.

  • Condition Type
    Select Game State.
  • Game State
    Select Game Running.
  • Check State
    Select Active.

Machine Execution Settings

  • Asset Type
    Select Schematics.
  • Schematics Asset
    Select PlayerControl.
  • Execution Type
    Select Single.
  • Update Type
    Select Update.

And that’s it for now – apply the changes to the player’s prefab by clicking on Apply (top of the inspector).

Don’t forget to save the scene.

Testing

Click on Play to test the game. You’ll be able to move for 1 tile – after that, the player’s turn ends.

The next tutorial will handle walls, food and exit.