Playing air hockey is fun – until you loose again and again! Wouldn’t it be nice if we could have easy, medium and hard difficulty so that everyone will have the ability to choose how quick their opponent will be?
In this tutorial you will learn how to add a difficulty system into your game and also how to create a basic UI with toggles and a toggle group.
This post contains all the code that’s been written in this YouTube video.
IResettable.cs
public interface IResettable
{
void ResetPosition();
}
GameValues.cs
public static class GameValues {
public enum Difficulties { Easy, Medium, Hard };
public static bool IsMultiplayer;
public static Difficulties Difficulty = Difficulties.Easy;
}
MenuManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class MenuManager : MonoBehaviour {
public Toggle MultiplayerToggle;
public GameObject DifficultyToggles;
private void Start()
{
MultiplayerToggle.onValueChanged
.AddListener(isMultiplayerOn => DifficultyToggles.SetActive(!isMultiplayerOn));
MultiplayerToggle.isOn = GameValues.IsMultiplayer;
DifficultyToggles.transform.GetChild((int)GameValues.Difficulty).GetComponent<Toggle>().isOn = true;
}
public void PlayGame()
{
SceneManager.LoadScene("main");
}
public void SetMultiplayer(bool isOn)
{
GameValues.IsMultiplayer = isOn;
}
#region Difficulty
public void SetEasyDifficulty(bool isOn)
{
if (isOn)
GameValues.Difficulty = GameValues.Difficulties.Easy;
}
public void SetMediumDifficulty(bool isOn)
{
if (isOn)
GameValues.Difficulty = GameValues.Difficulties.Medium;
}
public void SetHardDifficulty(bool isOn)
{
if (isOn)
GameValues.Difficulty = GameValues.Difficulties.Hard;
}
#endregion
}
AiScript.cs
using UnityEngine;
public class AiScript : MonoBehaviour, IResettable {
public float MaxMovementSpeed;
private Rigidbody2D rb;
private Vector2 startingPosition;
public Rigidbody2D Puck;
public Transform PlayerBoundaryHolder;
private Boundary playerBoundary;
public Transform PuckBoundaryHolder;
private Boundary puckBoundary;
private Vector2 targetPosition;
private bool isFirstTimeInOpponentsHalf = true;
private float offsetXFromTarget;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
startingPosition = rb.position;
playerBoundary = new Boundary(PlayerBoundaryHolder.GetChild(0).position.y,
PlayerBoundaryHolder.GetChild(1).position.y,
PlayerBoundaryHolder.GetChild(2).position.x,
PlayerBoundaryHolder.GetChild(3).position.x);
puckBoundary = new Boundary(PuckBoundaryHolder.GetChild(0).position.y,
PuckBoundaryHolder.GetChild(1).position.y,
PuckBoundaryHolder.GetChild(2).position.x,
PuckBoundaryHolder.GetChild(3).position.x);
UiManager.Instance.ResetableGameObjects.Add(this);
switch (GameValues.Difficulty)
{
case GameValues.Difficulties.Easy:
MaxMovementSpeed = 10;
break;
case GameValues.Difficulties.Medium:
MaxMovementSpeed = 15;
break;
case GameValues.Difficulties.Hard:
MaxMovementSpeed = 20;
break;
}
}
private void FixedUpdate()
{
if (!PuckScript.WasGoal)
{
float movementSpeed;
if (Puck.position.y < puckBoundary.Down)
{
if (isFirstTimeInOpponentsHalf)
{
isFirstTimeInOpponentsHalf = false;
offsetXFromTarget = Random.Range(-1f, 1f);
}
movementSpeed = MaxMovementSpeed * Random.Range(0.1f, 0.3f);
targetPosition = new Vector2(Mathf.Clamp(Puck.position.x + offsetXFromTarget, playerBoundary.Left,
playerBoundary.Right),
startingPosition.y);
}
else
{
isFirstTimeInOpponentsHalf = true;
movementSpeed = Random.Range(MaxMovementSpeed * 0.4f, MaxMovementSpeed);
targetPosition = new Vector2(Mathf.Clamp(Puck.position.x, playerBoundary.Left,
playerBoundary.Right),
Mathf.Clamp(Puck.position.y, playerBoundary.Down,
playerBoundary.Up));
}
rb.MovePosition(Vector2.MoveTowards(rb.position, targetPosition,
movementSpeed * Time.fixedDeltaTime));
}
}
public void ResetPosition()
{
rb.position = startingPosition;
}
}

Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?
Thanks for sharing. I read many of your blog posts, cool, your blog is very good.
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me?
Your article helped me a lot, is there any more related content? Thanks!
Thank you for your sharing. I am worried that I lack creative ideas. It is your article that makes me full of hope. Thank you. But, I have a question, can you help me? https://www.binance.info/ro/register?ref=HX1JLA6Z
Can you be more specific about the content of your article? After reading it, I still have some doubts. Hope you can help me.