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.
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.