Aiuto Programmazione Primo Gioco

MidNight_

Utente Attivo
439
73
CPU
i7-8700k 4.7Ghz
Dissipatore
Corsair H100i v2
Scheda Madre
Z370 Gaming 7
Hard Disk
SSD Kingstone 250gb, WD Blue 1tb, Toshiba P300 2tb/3tb
RAM
G.Skill TrindentZ 16gb ddr4 3200Mhz
Scheda Video
Asus Strix Gtx 1080 8gb
Monitor
Acer KA240HQ
Alimentatore
Corsair CX650M
Case
NZXT s340 elite
Sistema Operativo
Windows10 pro
Ciao a tutti! Come avete potuto leggere dal titolo sto cercando di programmare il mio primo gioco. Ho fatto tutto da autoditatta quindi alcune cosa ancora devo capirle bene anche se credo di aver fatto un buon lavoro fino ad ora e viste le conoscenze che ho. Comunque parlando del problema che mi sta tenendo impegnato da due giorni ormai, non riesco a capire come mai non funzioni e sto impazzendo. Il mio gioco è molto simile a flappy bird se lo conoscete, solo che è in 3D, ci sono ostacoli e percorsi diversi e vari livelli. La prima scena è il menù iniziale dove se si preme il pulsante "Start" si passa alla seconda scena ovvero la selezione dei livelli. Ovviamente volevo fare in modo che inizialmente si potesse giocare solo il primo livello quindi ho messo un trigger alla fine di ogni livello che man mano sblocca i vari pulsanti per i livelli successivi. Il problema è che se si ritorna al menù i progressi non vengono salvati e i livelli dal 2 in poi sono di nuovo bloccati. Informandomi ho visto che in unity (e si sto usando Unity, mi sono scordato di dirlo) ci sta la possibilita di usare " PlayerPrefs" per salvare poche cose. L'ho gia usato per salvare le cose che si possono acquistare in game tramite delle monete nei livelli, e lì funziona perfettamente, ma se devo salvare il fatto di aver completato un livello non va. Vi spiego cosa ho fatto: Ho creato un int livello1Complete e ho fatto in modo che il suo valore iniziale fosse 0, mettendo nella funzione void start nel menù "PlayerPrefs.SetInt("Livello1Complete", 0)". Nello script del trigger del primo livello ho usato la funzione void OnTriggerEnter e ho messo "PlayerPrefs.SetInt("Livello1Complete", 1)", così che quando il mio player passa attraverso il trigger l'int diventi = 1. Poi nel mio script dove tengo tutte le funzione che regolano il gioco (tipo il restart del livello quando si muore, le particelle sempre quando si muore e dove tenevo anche la funzione per attivare il bottone quando completavo un livello) ho meso nella funzione void start il fatto che grazie al PlayerPrefs si prenda l'int con GetInt e con una funzione if ho detto che se l'int è = 1 il bottone del livello 2 si deve attivare e con "else" ho detto che deve rimanere disattivato. Non so se sono riuscito a spiegarmi Senza dover mettere gli script in questione perchè sono molto disordinati e non so se si riesce a capire e penso sia più semplice se vi spiego io cosa ho fatto, ma se serve ditemelo che li metto. Se non sono riuscito a spiegarmi o non capite qualcosa ditemelo senza problemi. Ringrazio già chi si cimenterà nel cercare di capire questa cosa :cav:
 

MatteFra

Nuovo Utente
48
6
CPU
i7-8750H 2.2GHz
Hard Disk
Local C Disk: 512 gb; Local D Disk: 1 tb
RAM
16 gb
Scheda Video
GTX 1050 TI 4 gb
Sistema Operativo
Windows 10 home
Purtroppo non saprei dirti così vorrei vedere almeno vedere il blocco di codice nel quale si verifica il problema
 

MidNight_

Utente Attivo
439
73
CPU
i7-8700k 4.7Ghz
Dissipatore
Corsair H100i v2
Scheda Madre
Z370 Gaming 7
Hard Disk
SSD Kingstone 250gb, WD Blue 1tb, Toshiba P300 2tb/3tb
RAM
G.Skill TrindentZ 16gb ddr4 3200Mhz
Scheda Video
Asus Strix Gtx 1080 8gb
Monitor
Acer KA240HQ
Alimentatore
Corsair CX650M
Case
NZXT s340 elite
Sistema Operativo
Windows10 pro
Va bene, allora allego i vari script di cui parlo. Il primo è il mio "GameManager" dove come ho detto ho tutte le funzioni principali per il gioco. Tutti quei GameObject activeButtonuno/due/tre/.. con le rispettive funzioni è il modo in cui funziona il fatto di bloccare i bottoni però non salva se torno al menù. La parte del void start è quello che sto provando ora. Il secondo è lo script per il trigger alla fine del livello 1 in cui dico che se il player passa per il trigger l'int diventa = 1. E l'ultimo è semplicemente lo script per il menù iniziale in cui ho le funzioni dei vari bottoni per iniziare il gioco e per lo shop e nella funzione void start ho aggiunto il fatto che l'int abbia un valore = 0.
C#:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
   
{
    bool gameHasEnded = false;
    public float restartDelay = 1f;
 
    public Button activeButton;
    public GameObject completeLevelUI;
    public GameObject activeButtondue;
    public GameObject activeButtontre;
    public GameObject selectLeveUI;
    public GameObject activeButtonquattro;
    public GameObject activeButtoncinque;
    public GameObject activeButtonsei;
    public GameObject activeButtonsette;
    public GameObject esplosione;
    public GameObject player;
    int livello1Complete;
   
   
    void start(){
       
        livello1Complete = PlayerPrefs.GetInt("Livello1Complete");
        if (livello1Complete == 1)
        activeButton.interactable = true;
        else
        activeButton.interactable = false;
    }
   
   
    public void CompleteLevel1 ()
    {
        completeLevelUI.SetActive(true);
    }
   
   




    public void ActiveButtondue ()
        {
        activeButtondue.SetActive(true);
        }
    public void SelectLeve(){
        selectLeveUI.SetActive(true);
        }  

    public void ActiveButtontre(){
        activeButtontre.SetActive(true);
    }
    public void ActiveButtonquattro(){
        activeButtonquattro.SetActive(true);
    }
    public void ActiveButtoncinque(){
        activeButtoncinque.SetActive(true);
    }
   public void ActiveButtonsei(){
       activeButtonsei.SetActive(true);
   }
   public void ActiveButtonsette(){
       activeButtonsette.SetActive(true);
   }
   public void Esplosione(){
       esplosione.SetActive(true);
   }
   public void PlayerDie()
{
       player.SetActive(false);
}



   
    public void EndGame()
       
    {
        if (gameHasEnded == false)
            {
            gameHasEnded = true;
        Invoke("Restart", restartDelay);
        player.SetActive(true);
        }
       
    }
    void Restart()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().name);
    }
   
}

C#:
using UnityEngine;
using UnityEngine.UI;

public class EndTrigger1 : MonoBehaviour
{

    public GameManager gameManager;
    int livello1Complete;
 
    void OnTriggerEnter ()
    {
        gameManager.CompleteLevel1();
        PlayerPrefs.SetInt("Livello1Complete", 1);
    }
       
   
}

C#:
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Menù : MonoBehaviour
{
    int livelllo1Complete;
    void start(){
        livelllo1Complete = PlayerPrefs.GetInt("Livello1Complete");
        PlayerPrefs.SetInt("Livello1Complete", 0);
    }
    public void StartGame()
    {
        SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
    }
    public void Shop(){
        SceneManager.LoadScene("Shop");
    }
}
 

MatteFra

Nuovo Utente
48
6
CPU
i7-8750H 2.2GHz
Hard Disk
Local C Disk: 512 gb; Local D Disk: 1 tb
RAM
16 gb
Scheda Video
GTX 1050 TI 4 gb
Sistema Operativo
Windows 10 home
PREMESSA: Ti consiglio di commentare le varie istruzioni così anche tu se in futuro dovresti modificare o aggiungere nuove funzionalità almeno sai che scopo assumono.

Per il tuo problema prova ad utilizzare le condizioni per tenere sbloccato l'ultimo livello raggiunto dal Player.

Io proverei per esempio così:

Codice:
if (gameHasEnded = true)
            {
                if (player = StartGame)
                {
                    SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);
                }
            }
io per esempio ho detto solo se il programma dovesse chiudersi ma tu puoi aggiungere le doppie barre nella condizione (||) e dire se il giocatore esce dal menu, ...
 

MidNight_

Utente Attivo
439
73
CPU
i7-8700k 4.7Ghz
Dissipatore
Corsair H100i v2
Scheda Madre
Z370 Gaming 7
Hard Disk
SSD Kingstone 250gb, WD Blue 1tb, Toshiba P300 2tb/3tb
RAM
G.Skill TrindentZ 16gb ddr4 3200Mhz
Scheda Video
Asus Strix Gtx 1080 8gb
Monitor
Acer KA240HQ
Alimentatore
Corsair CX650M
Case
NZXT s340 elite
Sistema Operativo
Windows10 pro
Per il tuo problema prova ad utilizzare le condizioni per tenere sbloccato l'ultimo livello raggiunto dal Player.
Io però vorrei che il livello successivo si sbloccasse una volta terminato il precedente e non quando il player inizia quello nuovo. Visto che alla fine di ogni livello ho aggiunto che appare una schermata che ti chiede se vuoi andare subito al livello successivo e se tornare al menù, se facessi come dici te e io decidessi di andare al menù alla fine di un livello, il livello successivo sarebbe ancora bloccato. Sbaglio? Perchè questo è quello che ho capito che intendi.

PREMESSA: Ti consiglio di commentare le varie istruzioni così anche tu se in futuro dovresti modificare o aggiungere nuove funzionalità almeno sai che scopo assumono.
Si hai ragione, grazie mille!
 

MatteFra

Nuovo Utente
48
6
CPU
i7-8750H 2.2GHz
Hard Disk
Local C Disk: 512 gb; Local D Disk: 1 tb
RAM
16 gb
Scheda Video
GTX 1050 TI 4 gb
Sistema Operativo
Windows 10 home
Io però vorrei che il livello successivo si sbloccasse una volta terminato il precedente e non quando il player inizia quello nuovo. Visto che alla fine di ogni livello ho aggiunto che appare una schermata che ti chiede se vuoi andare subito al livello successivo e se tornare al menù, se facessi come dici te e io decidessi di andare al menù alla fine di un livello, il livello successivo sarebbe ancora bloccato. Sbaglio? Perchè questo è quello che ho capito che intendi.


Si hai ragione, grazie mille!
Sì mi sono espresso male, sto cercando di capire come hai impostato il tuo programma io credevo che il giocatore in un livello dovesse completarlo a prescindere e ho capito adesso che c'è il famoso menu che dice al player se vuole andare al livello successivo. Io intendo infatti che il livello sarebbe sempre bloccato perché avevo tralasciato il fatto che non era presente la funzione di proseguire attraverso un'opzione dl menu. La cosa che non capisco è che se il player decidesse di andare al menu è ovvio che il livello successivo sia bloccato (se ovviamente non lo ha sbloccato precedentemente)
 

MidNight_

Utente Attivo
439
73
CPU
i7-8700k 4.7Ghz
Dissipatore
Corsair H100i v2
Scheda Madre
Z370 Gaming 7
Hard Disk
SSD Kingstone 250gb, WD Blue 1tb, Toshiba P300 2tb/3tb
RAM
G.Skill TrindentZ 16gb ddr4 3200Mhz
Scheda Video
Asus Strix Gtx 1080 8gb
Monitor
Acer KA240HQ
Alimentatore
Corsair CX650M
Case
NZXT s340 elite
Sistema Operativo
Windows10 pro
Ti stavo riscrivendo per filo e per segno come fosse strutturata la successione delle scene quando mi è venuto un lampo di genio che in realtà non so come ho fatto a non pensarci. Io sto facendo tutto questo perchè lo shop si può raggiungere solo dal menù, ma se vado nel menù non mi salva i progressi fatti con i livelli, ma se sto nella scene "seleziona livello" li mantiene. Quindi ora sembra sia tutto apposto , ho tolto la possibilità di tornare al menù, che comunque non serviva a niente a parte far partire il gioco, e ho spostato il bottone dello shop nella scena del selezione livello.
Post automaticamente unito:

Ora devo aggiungere un modo per salvare i progressi anche quando si esce dal gioco ma per quello cerco un tutorial e vedo se riesco a farlo da solo, in caso apro un altro post a riguardo.
 

Entra

oppure Accedi utilizzando

Discussioni Simili

Hot del momento