How to keep player skin through restart

42 Views Asked by At

I'm trying to keep the player skin, even when reloading the scene, or moving on to a new one. The player object changes every scene.

The player skin is chosen in a pause menu, with three buttons. Each one of those buttons calls a function in the script below. I'm trying to call one of these functions, based on what value the PlayerPrefs int holds, and the function does get called; But throws the error MissingReferenceException: The object of type 'GameObject' has been destroyed but you are still trying to access it

Below is what i have already tried, but this throws an error on scene reload (death) i don't know what i'm doing wrong here.

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

public class Pausemenu : MonoBehaviour
{


    public static bool gameIsPaused = false;

    public GameObject pauseMenuUI;

    public Material BelgianMat;

    public Material Ball2;

    public Material Rainbow;

    public GameObject Player;

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape)) {

            if (gameIsPaused) {
                Resume();
            } else {
                Pause();
            }

        }
    }
    public void Resume(){
        pauseMenuUI.SetActive(false);
        Time.timeScale = 1f;
        gameIsPaused = false;
    }

    void Pause() {
         pauseMenuUI.SetActive(true);
         Time.timeScale = 0f;
         gameIsPaused = true;
    }
    
    public void LoadMenu() {
        Time.timeScale = 1f;
        gameIsPaused = false;
        SceneManager.LoadScene("Menu");
    }

    public void QuitGame() {
        Debug.Log("Quitting");
        Application.Quit();
    }

    public void ApplyBelgian() {
        Player.GetComponent<Renderer>().material = BelgianMat;
        PlayerPrefs.SetInt("playerMat", 0);
    }

    public void ApplyBall2() {
        Player.GetComponent<Renderer>().material = Ball2;
        Debug.Log("Applied ball two");
        PlayerPrefs.SetInt("playerMat", 1);
    }

    public void ApplyRainbow() {
        Player.GetComponent<Renderer>().material = Rainbow;
        PlayerPrefs.SetInt("playerMat", 2);
        }

     void OnEnable()
    {
        Debug.Log("OnEnable called");
        SceneManager.sceneLoaded += OnSceneLoaded;
    }

    // called second
    void OnSceneLoaded(Scene scene, LoadSceneMode mode)
    {
        Debug.Log("OnSceneLoaded: " + scene.name);
        Debug.Log(mode);
        if (PlayerPrefs.GetInt("playerMat") == 0) {
            ApplyBelgian();
        } 
        else if (PlayerPrefs.GetInt("playerMat") == 1) {
            Debug.Log("gonna apply ball 2");
            ApplyBall2();
        } 
        else if (PlayerPrefs.GetInt("playerMat") == 2) {
            ApplyRainbow();
        }
    }
}
1

There are 1 best solutions below

0
On BEST ANSWER

I don't know why but it seems like the reference to the Player object may be broken after loading the scene. If this is the case, add a "Player" tag to your Player object and add this to the OnEnable function: Player = GameObject.FindWithTag("Player");