Archivio ScriptsImparare UnityTips

Una finestra di sviluppo personalzzata

In questo articolo vedremo una di quelle funzionalità che vengono chiamate tipicamente "time-saving features" ovvero delle carateristiche che velocizzano il lavoro e ci fanno risparmiare tempo durante lo sviluppo di un videogioco.
Andremo a "potenziare" la strumentazione a nostra disposizione rendendola personalizzata per le nostre esigenze. 

Avrete a disposizione una nuova finestra dell'editor con una serie di pulsanti che potranno essere usati per eseguire istantaneamente i metodi da voi assegnategli. Sia a run-time che con la scena non avviata.
Per comprendere l'utilità di questo sistema, facciamo degli esempi:

Mettiamo che ad inizio scena (appena premuto "Paly" sull'editor di Unity) la vostra telecamera o personaggio principale si trovi in punto d'inizio impostato da voi di default che è molto distante dal punto dela scena che state testando.
Dovrete "far camminare" con il vostro personaggio per molti minuti prima di arrivare in quel punto, per vedere se tutto funziona come dovrebbe.
Vorreste che durante lo sviluppo del gioco, con un semplice click ad un pulsante il personaggio si sposti nel punto in cui volete voi, oppure vorreste che la sua velocità diventi x10, così che si possa spostare per la scena in modo veloe per raggiungere parti del livello molto distanti senza farlo camminare alla velocità normale che poi avrà nel gioco.
Oppure volete che premendo un tasto il vostro personaggio possa volare o attraversare i muri...

Oppure;
mentre state testando il gioco l'energia del giocatore sta per finire ma voi dovete ancora andare avanti a testare il livello. Sarebbe bello avere un pulsante con cui ricaricare l'energia all'istante, per continuare i test che stavate facendo. Oppure un pulsante che attivi una sorta di invulnerabilità del giocatore.

Oppure;
dovete testare un item che se raccolto dal giocatore deve fare qualche cosa. Ma nel momento in cui premete Play sull'editor tale oggetto non è presente vicino al giocatore. Sarebbe utile avere un pulsante con l'opzione "raccogli item" che se premuto simuli la raccolta di quell'oggetto. Oppure un pulsante che istanzi quell'oggetto vicino al giocatore.

 In pratica potrete eseguire una qualsiasi funzione alla pressione di un pulsante su una finestra dell'edior che avrete sempre a disposizione e che non dovrete curarvi di eliminare nel momento della Build perché presente e funzionante sono in Editor.

Nella vostra finestra potrete inserire pulsanti che eseguono azioni specifiche del gioco a run-time ma anche operazioni dell'editor.

 
Esempio

Qui sotto, in quesa immagine potete vedere la finestra che uso per "far fare delle cose al gioco" in modo veloce, cose che nel gioco finale non saranno possibili ma che durante lo sviluppo velocizzano il lavoro di testing.
Ma non solo. Per esempio ho dei pulsanti che uso frequentemente per fare una serie di operazioni veloci con un click, anche durante la fase di editing.

Nel mio caso, premendo il primo pulsante viene ricaricato l'ossigeno del giocatore (cosa che altrimenti dovrei fare facendo muovere il personaggio nelle vicinanze di specifiche postazioni sparse per il livello).
Il secondo pulsante riposiziona il personaggio principale (che si chiama Kaleb) in un punto specifico del livello.
Il terzo pulsante fa muovere il personaggio a velocità aumentata che nel gioco reale non sarà possibile raggiungere.
Gli altri pulsanti (sotto Quick Slections) servono a selezionare velocemente un determinato gameObject nella Hierarchy, perché nel mio caso molti degli oggetti principali cambiano posizione e parent nella Hierarchy durante lo svolgimento del gioco e per evitare di fare una ricerca, mi basta click su un pulsante.

La parte in blu riguarda lo spostamento dei gameObjects selezionati sotto un nuovo parent scelto tramite stringa. Questa parte lavora nell'editor dunque non a run-time. Mi torna molto utile per riorganizzare i miei gameObjects sotto un unico parent senza dover fare tante operazioni spostandomi continuamente dentro una Hierarchy piuttosto affollata.
In pratica "Move To new Parent" fa questo:
scrivo il nome del gameObject dove voglio raggruppare dei gameObjects children. Seleziono tutti i gameObjects che voglio e premo sul pulsante "Move Slected To Parent". Tutti i gameObject che avevo selezionato andranno "sotto" l'unico parent che verrà ricercato per nome tramite la stringa che ho specificato.


Vediamo come fare per creare la nostra finestra personalizzata.

Innanzi tutto dobbiamo creare un nuovo script.
Questo script deve trovarsi nella cartella Editor perché si tratta di uno script non utilizzato e compreso nella Build per lo svolgimento del gioco e dunque sarà funzionante solo durante lo svlippo del gioco in Unity.
In realtà è sufficiente che gli script destinati all'editor come questo si trovino in una qualsiasi cartella chiamata Editor, anche se con un percorso diverso dal classico Asses/Editor. Possono esserci infinite cartelle Editor dentro un progetto.
Se non avete tale cartella nel vostro progetto, createla.

Essendo questo script destinato all'uso nell'editor, dovremmo inserire il namespace specifico:

using UnityEditor;

Andremo poi ad aprire la nostra classe con una terminologia diversa dal solito MonoBehaviour, infatti questa classe deriverà dalla classe EditorWindow:

public class MiaFinestra: EditorWindow
{

Questo è un esempio di partenza per avere una nostra finestra personalizzata:

using UnityEditor;
using UnityEngine;

public class MiaFinestra : EditorWindow
{



    [MenuItem("Window/MiaFinestra")]
    public static void ShowWindow()
    {
        GetWindow<MiaFinestra>("MiaFinestra");
    }




    void OnGUI()
    {

        //Qui dentro andremo ad inserire i pulsanti e le loro azioni

    }



    }

Se andate a controllare sul menu di Unity, sotto il menu Window troverete adesso una nuova opzione, chiamata con il nome che avete scelto per la vostra finestra.
Cliccandoci si aprirà la vostra nuova finestra, che per il momento  è vuota.
Potete spostare o agganziare la finestra dove volete, ma se avete intenzione di usare qualche comando che influisca sul gioco a Run-Time, vi consiglio di lasciarla "fluttuante" così che appaia in sovraimpressione allo schermo anche quando testate il gioco in full-screen.

Inseriamo due pulsanti che alla loro pressione eseguano i relativi metodi.

using UnityEditor;
using UnityEngine;

public class MiaFinestra : EditorWindow
{



    [MenuItem("Window/MiaFinestra")]
    public static void ShowWindow()
    {
        GetWindow<MiaFinestra>("MiaFinestra");
    }





    void OnGUI()
    {

        GUILayout.Label("Funzioni Varie per il debug a runtime", EditorStyles.boldLabel);

        if (GUILayout.Button("Ricarica Energia"))
        {
                EnergyRecarge();
        }
        
        if (GUILayout.Button("Istanzia Nemico"))
        {
                EnemyIntance();
        }

    }





      //Ricarica l'energia del player
    void EnergyRecarge()
    {
        mioPlayerManager.energy=100;
    }
    
    //Crea un nuovo nemico vicino al player
        void EnemyIntance()
    {
        GameObject nuovoNemico = Instantiate(EnemyPrefab, Player.position + Vector3.right * 10);
    }





    }

Il risultato sarà una finestra con i due pulsanti che potrete utilizzare durante l'esecuzione del gioco nell'editor.

Ovviamente in questo esempio i metodi usati sono solo di esempio, voi potrete sbizzarrirvi come più vi sarà congeniale per lavorare più velocemente al vostro progetto.
Se avete delle azioni specifiche che volete "scatenare" alla pressione di un tasto e non sapete bene come fare, chiedete pure.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *