impresaline logo

Creare tessera fedeltà a punti gratis

ImpresaLine è il servizio di JeJnet Solutions gratuito per creare e gestire le tessere fedeltà, buoni regalo e tessere prepagate per il tuo negozio e la tua attività commerciale.  ImpresaLine è disponibile all’indirizzo  http://jejnet.com/impresaline . Per iniziare registrati su ImpresaLine e visita la sezione dedicata http://www.jejnet.com/impresaline/guida/ per saperne di più. Il servizio è gratuito e non richiede il download di software o l’installazione di  programmi sul tuo PC.

Per accedere e utilizzare ImpresaLine è sufficiente una connessione internet. Avrai accesso completo alla gestione delle tessere fedeltà rilasciate ai tuoi clienti, buoni regalo e tessere prepagate, ovunque e in qualsiasi momento. http://jejnet.com/impresaline

Unity – Ottimizzazione istanziazione (spawn) e distruzione oggetti runtime

Creare un gioco con Unity 3D conoscendo anche solo le basi è relativamente facile, il difficile arriva quando dovrete ottimizzare il gioco! Credetemi, niente è più frustrante di aver trascorso ore, giorni se non settimane o mesi a sviluppare il vostro gioco per poi ritrovarvi a fare il porting sul vostro smartphone e scoprire che questo semplicemente “s’impalla”. Ebbene se il frame rate è orribile, è tempo di ottimizzare!

In questo articolo tratterò il problema della gestione dello spawn (istanziazione) e distruzione di oggetti a tempo di esecuzione nel gioco. Un esempio semplice e caso più frequente può essere un gioco in cui il player si ritrova a sparare una raffica di proiettili contro qualche nemico. Se state facendo qualcosa come

Instantiate (proiettile, transformProiettile.position, transformProiettile.rotation);

e poi il conseguente

Destroy (proiettile);

allora non va bene! Ogni volta che eseguite Instatiate o Destroy, il gioco va a allocare o deallocare in ram l’oggetto “Proiettile”, questa è una cosa davvero rilevante per le performance, specialmente se l’oggetto in questione ha un grande numero di triangoli, esegue operazioni complesse quando viene creato o nè instanziate e distruggete in grandi quantità.

La soluzione è creare un pool di oggetti, in questo caso proiettili, nel momento in cui la scena del gioco viene creata. Per essere più chiaro il pool degli oggetti sarà, in questo esempio, un oggetto in cui avremo un riferimento a tutti i GameObject di tipo proiettile che andremo a istanziare all’inizio del gioco. In questo modo non sarà necessario andare a istanziare un proiettile ogni volta che ne avremo bisogno perchè lo avremo già fatto all’inizio del gioco. Quindi ciò che faremo quando avremo bisogno di un proiettile è prendere un riferimento al proiettile che abbiamo creato all’inizio e utilizzarlo, alla fine quando quel proiettile non servirà non andremo a distruggerlo ma lo disattiveremo. Nessun bisogno di allocare e deallocare memoria ogni volta. Andiamo adesso a scrivere una nuova classe che chiameremo PoolObject.

I campi saranno solo 4.

GameObject obj; //l'oggetto proiettile

public List<GameObject> listObj = new List<GameObject>(); //la lista in cui metteremo i nostri proiettili che andremo ad utilizzare

int quantitaAggiuntiva=0; // è la quantità extra di proiettili da creare nel caso nè avremo bisogno in futuro

int quantitaTotale=0; //la quantità totale di proiettili presenti nel gioco

//è qui che andiamo a chiamare la funzione che crea il pool. Gli passeremo il GameObject che in questo caso sarà il proiettile, la quantità da creare, la chiamata all’istanziazione effettiva e la quantità eventualmente aggiuntiva.
public void  inizializza(GameObject obj, int quantitaIniziale, int quantitaAggiuntiva) { this.obj = obj; creaPool(quantitaIniziale); this.quantitaAggiuntiva = quantitaAggiuntiva;}

// a questo punto il pool viene creato. Data la quantità di proiettili di cui avremo bisogno, la funzione li crea e li disattiva, salvando un riferimento al proiettile in listObj.
public void creaPool (int quantita) {
for (int i = 0; i < quantita; i++)  {
GameObject myObj = (GameObject)Instantiate(obj);
myObj.SetActive(false);
listObj.Add(myObj);
} this.quantitaTotale += quantita;
}

// il metodo usaObj() prende un proiettile dalla lista di proiettili dal pool e lo restituisce. Se il pool si svuota e abbiamo deciso di aggiungere dei proiettili allora riempiremo il pool con nuovi proiettili subito pronti all’uso, supponendo che quando abbiamo inizializzato l’oggetto PoolObject abbiamo anche specificato una quantità aggiuntiva. Se non è stata specificata allora dovremo aspettare che i proiettili adesso attivi tornino nel pool. Attenzione a non abusare della quantità aggiuntiva cercando di inizializzare PoolObject con tanti proiettili quanti ce nè serviranno.
public GameObject usaObj()
{
int numObj = listObj.Count;
if (listObj.Count > 0)
{
numObj--;
GameObject gm = listObj[numObj];
listObj[numObj].SetActive(true);
listObj.RemoveAt(numObj);
return gm;
}
else
{
Debug.LogWarning ("Proiettili finiti! Il pool è vuoto.");
Debug.LogWarning("Il POOL di " + obj[0].name + " è VUOTO!");
if(quantitaAggiuntiva>0) {
creaPool(quantitaAggiuntiva);
return usaObj(); //utilizzo della ricorsione
}
}
}

public int getQuantitaTotale(){ return quantitaTotale; } //per ottenere il numero di tutti i proiettili presenti nel gioco, inclusi quelli attivi e non presenti al momento in listObj (il pool)
public int getQuantitaDisponibile(){ return listObj.Count; } //la quantita di proiettili attualmente presente nel pool
public void ritornaInPool(GameObject gameobject) { listObj.Add(gameobject); gameobject.SetActive(false); } //quando il proiettile dovrà tornare nel pool, perchè per esempio ha colpito un oggetto, il proiettile chiamerà questo metodo passando come parametro se stesso, PoolObject aggiungerà un riferimento al proiettile che verrà poi disattivato. Quindi ogni istanza del proiettile tornerà pronta all’uso.

E’ bene approssimare per eccesso il numero di proiettili, tuttavia inizializzare e quindi allocare il pool con molti più oggetti di quanti nè avremo bisogno significa sprecare memoria ram, mentre inizializzare con meno proiettili del necessario protrebbe farci rimanere a secco di proiettili proprio quando ci servono. A questo proposito ho inserito la quantità aggiuntiva, ma un utilizzo eccessivo di questa variabile inificierebbe lo scopo stesso del pool degli oggetti.

E’ importante calcolare bene il numero di oggetti di un certo tipo contemporaneamente attivi nella scena di cui avremo bisogno.

CUBEL the game, quasi pronto

In questi giorni sono in corso gli ultimi perfezionamenti di CUBEL. Manca ormai poco alla sua pubblicazione su App Store a cui seguirà il processo di verifica da parte di Apple. Con una media di 2 settimane nei tempi di approvazione, CUBEL sarà disponibile al download entro la fine di settembre 2015.

cubel the game

Il gioco è sul genere endless runner e CUBEL è la migliore agenzia per i viaggi spaziali intercubici, come lo stesso Whormole Magazine ha definito. CUBEL, azienda posseduta da Cubicini SpA, mette a disposizione i suoi tunnel spaziali cubici per i vostri viaggi, che siano d’affari o di vacanza. Sarete voi a scegliere e guidare il vostro mezzo di locomozione e grazie alla partnership con ViaggiaCubico srl potrete scegliere tra la sfera spaziale, un pollo, l’astronave Voyager, a bordo di un UFO o addirittura su un missile armato fino ai denti. 

Manca ormai poco all’arrivo di CUBEL, intanto è online il sito web dedicato! cubel-game.com