programming

Unity3D – Object Pooling – Bullets – CSharp

Unity3D – Object Pooling – Bullets – CSharp

Object Pooling è una tecnica per ridurre i calcoli della CPU.

Questo sistema di programmazione consiste nel creare un gruppo di oggetti, storarli inattivi all’interno di una lista, per poi attivarli e posizionarli direttamente nell’area di gioco.

La generazione di tutti gli oggetti comporta un consumo di RAM iniziale elevato, che comunque è molto meno costoso in termini di prestazioni del dover ogni volta istanziare e distruggere i singoli eggetti.

Applicare questa tecnica ha senso se utilizziamo a video nello stesso tempo almeno diverse centinaia di oggetti o stiamo sviluppando su piattaforma mobile dove la potenza di calcolo della CPU non è elevata.

Creiamo una scena con:

(parent) Spaceship
– (child) Bullet

All’oggetto ‘Bullet’ applichiamo:

BulletScript.cs


using UnityEngine;
using System.Collections;

public class BulletScript : MonoBehaviour {

	public float speed = 5;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		// simple move the object
		transform.Translate (0, speed * Time.deltaTime, 0);
	
	}

}// END MonoBehaviour

Questo script semplicemente muove l’oggetto

BulletDestroyScript.cs


using UnityEngine;
using System.Collections;

public class BulletDestroyScript : MonoBehaviour {

	// This function is called when the object becomes enabled and active.
	// It is a part of MonoBehaviour.OnEnable()
	void OnEnable()
	{
		Invoke ("Destroy", 2f); // call the function after 2 second
	}

	void Destroy()
	{
		gameObject.SetActive (false); // deactivate the object
	}

	// This function is called when the behaviour becomes disabled () or inactive.
	// It is a part of MonoBehaviour.OnDisable()
	void OnDisable()
	{
		CancelInvoke();
	}
	
}// END MonoBehaviour

Questo script disattiva l’oggetto dopo 2 secondi per ottimizzare il rendering

All’oggetto ‘Spaceship’ applichiamo:

BulletFireScript.cs


using UnityEngine;
using System.Collections;
using System.Collections.Generic; // to add Lists

public class BulletFireScript : MonoBehaviour {

	public float fireTime = .1f; // attiva un oggetto bullet ogni xxx secondi
	public GameObject bullet; // Assign in Inspector

	public int pooledAmount = 20; // numero di oggetto instanziati, se insufficienti aumentarli 
	public List<GameObject> bullets;

	// Use this for initialization
	void Start () {
		// crea una lista di oggetti inattivi
		bullets = new List<GameObject> (); 

		for (int i = 0; i < pooledAmount; i++) 
		{
			GameObject obj = (GameObject)Instantiate(bullet);
			obj.SetActive (false); // inattivi, verranno attivati dalla funzione Fire()
			bullets.Add (obj); // aggiungi l'oggetto alla lista
			Debug.Log(bullets.Count);
		}
		InvokeRepeating ("Fire", fireTime, fireTime); // richiama la funzione Fire()
	}// END Start

	void Fire() {
		// posiziona e attiva tutti gli aoggetti della lista bullets
		for (int i=0; i < bullets.Count; i++)// scorre tutti gli oggetti della scena
		{
			if (!bullets[i].activeInHierarchy)// se un oggetto nella scena non è attivo
			{
				bullets[i].transform.position = transform.position;// posiziona
				bullets[i].transform.rotation = transform.rotation;// rotazione
				bullets[i].SetActive(true);// attiva
				break;			
			}// END if
		}
	}// END Fire

}// END MonoBehaviour
	

Assegniamo in Inspector l’oggetto ‘Bullet’ alla variabile ‘bullet’

Questo script:
1. Crea una lista
2. Start () -> Instanzia 20 oggetti, li disattiva e li inserisce nella lista
3. Fire() -> posiziona gli oggetti e li attiva

Avviate il gioco, osservate Hierarchy e Inspector per BulletFireScript.cs per comprenderne il funzionamento

Si può notare dal codice di tutti gli script che – Destroy (gameObject) – NON è mai stata utilizzata, perchè i 20 oggetti bullet vengono continuamente riciclati attivandoli e disattivandoli di continuo.

By |Unity3D, Video Games Development|Commenti disabilitati su Unity3D – Object Pooling – Bullets – CSharp

Unity3D – Explosion Force – JavaScript

Unity3D – Explosion Force – JavaScript

Create a scene with:

– Plane (Collider)

– Cube1 (Collider + Rigid Body)
– Cube2 (Collider + Rigid Body)
– Cube3 (Collider + Rigid Body)

– Sphere (SphereExplosion.js)

SphereExplosion.js:

#pragma strict

	var radius = 50.0; // radius of explosion
	var power = 500.0; // power of explosion
	var bombObject : GameObject; // Assign in Inspector the Bomb GameObject
	
	
function Start () {
}
	
function OnMouseDown ()
{
        // When you click over the object
        
                // Force START -----------------------------------------------------------
                // Applies an explosion force to all nearby rigidbodies
		var explosionPos : Vector3 = bombObject.transform.position;
		// Returns an array with all colliders touching or inside the sphere.
		var colliders : Collider[] = Physics.OverlapSphere (explosionPos, radius);
		
		for (var hit : Collider in colliders) {
			if (hit && hit.rigidbody)
				hit.rigidbody.AddExplosionForce(power, explosionPos, radius, 3.0);
		}
		 // Force END -------------------------------------------------------------
		
}

function Update () {
}

Inspector> Assign the Sphere Mesh to var bombObject, setup var radius and var power

Play and click over the Sphere… boom!!!

By |Unity3D, Video Games Development|Commenti disabilitati su Unity3D – Explosion Force – JavaScript

Unity3D – warning Messages – BCW0028: WARNING: Implicit downcast from ‘UnityEngine.Component’ to ‘UnityEngine.AudioSource’

Unity3D – warning Messages – BCW0028: WARNING: Implicit downcast from ‘UnityEngine.Component’ to ‘UnityEngine.AudioSource’

Implicit Downcast from… to…

BCW0028: WARNING: Implicit downcast from ‘UnityEngine.Component’ to ‘UnityEngine.AudioSource’

This script will generate the BCW0028 error:

...

// buttons[i] -> this is an Array of GameObject

...
// Assegno Audio INIZIO #############################################################################
function AssignAudio () {
  
	var audioSrc : AudioSource;
	
	for(var i : int = 0; i < buttons.Length; i++) // assegno a tutti gli oggetti nell'array l'audio
	    {
	      	// BCW0028: WARNING: Implicit downcast from 'UnityEngine.Component' to 'UnityEngine.AudioSource'.
	      	audioSrc = buttons[i].AddComponent ("AudioSource"); 
	      	

	      	
			buttons[i].audio.clip = buttonAudio0; // Add audio clip
			buttons[i].audio.playOnAwake = false; // not play on awake  
	    }

}// END AssignAudio()
// Assegno Audio FINE ###############################################################################
...

Solution: you should explicity cast the Components to AudioSource yourself using “as” like this:

Change the row:

audioSrc = buttons[i].AddComponent ("AudioSource");

with

audioSrc = buttons[i].AddComponent ("AudioSource") as AudioSource;
By |Unity3D, Video Games Development|Commenti disabilitati su Unity3D – warning Messages – BCW0028: WARNING: Implicit downcast from ‘UnityEngine.Component’ to ‘UnityEngine.AudioSource’

Unity3D – GET variables from script attached to ANOTHER GameObject

Unity3D – GET variables from script attached to ANOTHER GameObject

Hierarchy:

– GameController (Empty GameObject) -> attach GameControllerScript.JS

GameControllerScript.js

#pragma strict

var score : int = 3; // NO PRIVATE or Cube.js can't access!!!

– Cube -> attach CubeScript.js

CubeScript.js

#pragma strict

var gameController : GameControllerScript;

function Start(){

    // get the script of GameController object START ----------------------------------
    var gameControllerObject : GameObject = GameObject.Find("/GameController");
    
     // if the object exist
     if (gameControllerObject != null) 
    {      
        // ottengo il componente script
        gameController = gameControllerObject.GetComponent (GameControllerScript);
    }
    // if the object does not exist
    if (gameControllerObject == null)
    {
        Debug.Log ("Cannot find 'GameControllerScript' script");
    }
    // get the script of GameController object END ------------------------------------

    // from the another script I will get the variable - score -
    var level : int = gameController.score; 
    Debug.Log("Level is: " + level); // the result is 3

}

For italian people: come funziona?

CubeScript.js esegue le seguenti operazioni:

1. dichiara una variabile per trovare e storare l’oggetto esterno con nome “/GameController”), notare lo slash che precede il nome necessario se l’oggetto no ha parent
– var gameControllerObject : GameObject = GameObject.Find(“/GameController”);

2. dichiara una variabile per ottenere e storare il componente dell’oggetto di cui al punto 1.
– var gameController : GameControllerScript;
– gameController = gameControllerObject.GetComponent (GameControllerScript);

3. dichiara e stora la variabile “score” proveniente dallo script esterno di cui al punto 2.
– var level : int = gameController.score;

IMPORTANTE: la variabile score DEVE essere pubblica, se è private non si potrà accedere ad essa con script esterni.

By |Unity3D, Video Games Development|Commenti disabilitati su Unity3D – GET variables from script attached to ANOTHER GameObject

Unity3D – Game Engine – Get Material Name

Unity3D – Game Engine – Get Material Name

Get the material of THIS gameobject.
IMPORTANT: material is not a Component but a class of renderer Component, the correct statement is:

...
// GameObject.Component.Class.Property
this.renderer.material.name
...

Create a Cube, assign a material named ‘material0’, assign the script:


#pragma strict

function Start () {

}

function OnMouseDown ()
{
        // When you click over the object play audio
        audio.Play();
        
        // Check material
        // NB: il materiale non è un componente ma una classe di renderer!!!!
        var myMaterial = renderer.material;
        Debug.Log(myMaterial); // -> Risulta: material0 (Instance)
        
    if (this.renderer.material.name == "material0 (Instance)") {
        Debug.Log("material0 found!");
    } else {
        Debug.Log("material0 not found!");
    }
}

function Update () {

}

By |Unity3D, Video Games Development|Commenti disabilitati su Unity3D – Game Engine – Get Material Name