Set Difficulty

I want to set the difficulty of the game from buttons and I cant figure out how to do it. I tried different methods and I searched how to do it but I didnt find something to help me so far.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class DifficultyButton : MonoBehaviour
{
    public static DifficultyButton Instance {  get; private set; }
    public int difficulty;
    private Button button;


    public void Awake()
    {
        Instance = this;
    }
    private void Start()
    {
        button = GetComponent<Button>();
        button.onClick.AddListener(SetDifficulty);
        button.onClick.AddListener(() =>
       SceneManager.LoadScene(5));

    }

  public  void SetDifficulty()
    {
        Debug.Log(gameObject.name + "Was clicked");
    }
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class IGameManager : MonoBehaviour
{
    public static IGameManager Instance { get; private set; }

    public event EventHandler OnStateChanged;
    public event EventHandler OnGamePaused;
    public event EventHandler OnGameUnpaused;
   private enum State
    {
        WaintingToStart,
        CountdownToStart,
        GamePlaying,
        GameOver,
    }

    private State state;
    private float waitingToStartTimer = 1.5f;
    private float countdownToStartTimer = 3f;
    private bool isGamePaused = false;

    public void Awake()
    {
        Instance = this;
        state = State.WaintingToStart;

    }
    private void Start()
    {
        GameInput.Instance.OnPauseAction += GameInput_OnPauseAction;
    }

  
    private void GameInput_OnPauseAction(object sender, EventArgs e)
    {
        TogglePauseGame();
    }

  

    private void Update()
    {
        switch (state)
        {
            case State.WaintingToStart:
                waitingToStartTimer -= Time.deltaTime;
               if(waitingToStartTimer < 0f)
               {
                    state = State.CountdownToStart;
                    OnStateChanged?.Invoke(this, EventArgs.Empty);
                }
                break;

            case State.CountdownToStart:
                countdownToStartTimer -= Time.deltaTime;
                if(countdownToStartTimer < 0f)
                {
                    state = State.GamePlaying;
                    OnStateChanged?.Invoke(this, EventArgs.Empty);
                }

                break;
            case State.GamePlaying:
                state = State.GamePlaying;
                if(Player.Instance.gameOver == true)
                {
                    state = State.GameOver;
                }

                OnStateChanged?.Invoke(this, EventArgs.Empty);
                break;
            case State.GameOver:
              
               
                    state = State.GameOver;
               
                OnStateChanged?.Invoke(this, EventArgs.Empty);
               
                break;
               
        }
        Debug.Log(state);
    }
    public bool IsGamePlaying()
    {
        return state == State.GamePlaying;
    }

    public bool IsCountdownToStartActive()
    {
        return state == State.CountdownToStart;
    }

    public float GetCountdownToStartTimer()
    {
        return  countdownToStartTimer;
    }

    public bool IsGameOver()
    {
        return state == State.GameOver;
    }

    public void TogglePauseGame()
    {
        isGamePaused = !isGamePaused;
        if(isGamePaused)
        {
            Time.timeScale = 0f;
            OnGamePaused?.Invoke(this, EventArgs.Empty);
           
        }
        else
        {
            Time.timeScale = 1f;
            OnGameUnpaused?.Invoke(this, EventArgs.Empty);
           
        }
    }

}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SpawnManager : MonoBehaviour
{
 
    public static SpawnManager Instance { get; private set; }
    public GameObject[] wallPrefab;

    private float startDelay = 4f;
    public float spawnInterval = 2f;


    public void Awake()
    {
        Instance = this;
    }
    public  void Start()
    {
         InvokeRepeating("SpawnRandomWall", startDelay, spawnInterval);
       
    }
  


    public void SpawnRandomWall()
    {
       
            int wallIndex = Random.Range(0, wallPrefab.Length);
            Vector2 spawnPos = new Vector2(10, 0);
       
            Instantiate(wallPrefab[wallIndex], spawnPos, wallPrefab[wallIndex].transform.rotation);
       
    }
}

This is not a problem description. Please let us know what you have tried and how and where it failed to work.

Break it into parts. One part is how to make a “radio button” work. That’s the name for buttons where only one can be selected – picking a new one turns off the old one. It’s how difficulty buttons with Easy, Medium, Hard work. Have it so it just prints out the word when you select, like “testing – easi was presed” and click around to test.

The other part is what difficulty does. Start with a public difficulty variable in the Inspector where you type 0-3 (which stands for easy, medium, hard, extreme). Then figure out how it’s used. That’s a lot of little steps. Maybe monster damage is always +difficulty (so orcs do 3-5 damage on easy, 4-6 on medium … ). Maybe also/instead monster HP is 10% higher per level of difficulty. Make and test how orcs have 50HP on easy, 55 on medium … . Think about what other games do for other ideas. This is a lot of work, but you don’t need buttons to do it – typing 0-3 into the Inspector is a hack until you get buttons working.

Of course the last step is making it so the buttons stop printing “testing – xtreme” and instead change the difficulty variable to the correct 0-3 number.

I tried so that the spawn rate of the objects is different depending of which difficulty
button is pressed but they do nothing(I know that right now they do nothing).I tried to make the DifficultyButton script comunicate with SpawnManager script and IGameManager script, but I got 2 warning(not errors) on the SpawnManager script.
And when I got rid of them the SpawnManager script was not doing anything to the game(the object where not spawned).
I know is not usseful but I dont know how to describe better what I was trying to do…

Just start with tutorials. Nobody is gonna retype all that noise and graphics in this little tiny box for you. Hit Youtube.

This is also not a useful way to report things.

The complete error message contains everything you need to know to fix the error yourself.

The important parts of the error message are:

  • the description of the error itself (google this; you are NEVER the first one!)
  • the file it occurred in (critical!)
  • the line number and character position (the two numbers in parentheses)
  • also possibly useful is the stack trace (all the lines of text in the lower console window)

Always start with the FIRST error in the console window, as sometimes that error causes or compounds some or all of the subsequent errors. Often the error will be immediately prior to the indicated line, so make sure to check there as well.

Look in the documentation. Every API you attempt to use is probably documented somewhere. Are you using it correctly? Are you spelling it correctly? Are you structuring the syntax correctly? Look for examples!

All of that information is in the actual error message and you must pay attention to it. Learn how to identify it instantly so you don’t have to stop your progress and fiddle around with the forum.

Remember: NOBODY here memorizes error codes. That’s not a thing. The error code is absolutely the least useful part of the error. It serves no purpose at all. Forget the error code. Put it out of your mind.

Try this one-step-at-a-time approach:

Imphenzia: How Did I Learn To Make Games:

Tutorials and example code are great, but keep this in mind to maximize your success and minimize your frustration:

How to do tutorials properly, two (2) simple steps to success:

Step 1. Follow the tutorial and do every single step of the tutorial 100% precisely the way it is shown. Even the slightest deviation (even a single character!) generally ends in disaster. That’s how software engineering works. Every step must be taken, every single letter must be spelled, capitalized, punctuated and spaced (or not spaced) properly, literally NOTHING can be omitted or skipped.
Fortunately this is the easiest part to get right: Be a robot. Don’t make any mistakes.
BE PERFECT IN EVERYTHING YOU DO HERE!!

If you get any errors, learn how to read the error code and fix your error. Google is your friend here. Do NOT continue until you fix your error. Your error will probably be somewhere near the parenthesis numbers (line and character position) in the file. It is almost CERTAINLY your typo causing the error, so look again and fix it.

Step 2. Go back and work through every part of the tutorial again, and this time explain it to your doggie. See how I am doing that in my avatar picture? If you have no dog, explain it to your house plant. If you are unable to explain any part of it, STOP. DO NOT PROCEED. Now go learn how that part works. Read the documentation on the functions involved. Go back to the tutorial and try to figure out WHY they did that. This is the part that takes a LOT of time when you are new. It might take days or weeks to work through a single 5-minute tutorial. Stick with it. You will learn.

Step 2 is the part everybody seems to miss. Without Step 2 you are simply a code-typing monkey and outside of the specific tutorial you did, you will be completely lost. If you want to learn, you MUST do Step 2.

Of course, all this presupposes no errors in the tutorial. For certain tutorial makers (like Unity, Brackeys, Imphenzia, Sebastian Lague) this is usually the case. For some other less-well-known content creators, this is less true. Read the comments on the video: did anyone have issues like you did? If there’s an error, you will NEVER be the first guy to find it.

Beyond that, Step 3, 4, 5 and 6 become easy because you already understand!

Finally, when you have errors, don’t post here… just go fix your errors! See the top of this post!

If you become absolutely stumped, then refer to this to get help:

How to report your problem productively in the Unity3D forums:

http://plbm.com/?p=220

This is the bare minimum of information to report:

  • what you want
  • what you tried
  • what you expected to happen
  • what actually happened, log output, variable values, and especially any errors you see
  • links to documentation you used to cross-check your work (CRITICAL!!!)

The purpose of YOU providing links is to make our job easier, while simultaneously showing us that you actually put effort into the process. If you haven’t put effort into finding the documentation, why should we bother putting effort into replying?

If you post a code snippet, ALWAYS USE CODE TAGS:

How to use code tags: https://discussions.unity.com/t/481379

  • Do not TALK about code without posting it.
  • Do NOT post unformatted code.
  • Do NOT retype code. Use copy/paste properly using code tags.
  • Do NOT post screenshots of code.
  • Do NOT post photographs of code.
  • ONLY post the relevant code, and then refer to it in your discussion.