Unity 3D – Stealth Game – Alarm Light

Unity 3D – Stealth Game – Alarm Light

1. MAIN TOp MENU> Create Other> Directional Light renami it ‘light_alarm_directional’

2. ‘Add Component’> Alarm Lights.js


#pragma strict

public var fadeSpeed : float = 2f;          // How fast the light fades between intensities.
public var highIntensity : float = 2f;      // The maximum intensity of the light whilst the alarm is on.
public var lowIntensity : float = 0.5f;     // The minimum intensity of the light whilst the alarm is on.
public var changeMargin : float = 0.2f;     // The margin within which the target intensity is changed.
public var alarmOn : boolean;               // Whether or not the alarm is on.


private var targetIntensity : float;        // The intensity that the light is aiming for currently.


function Awake ()
{
    // When the level starts we want the light to be "off".
    light.intensity = 0f;
    
    // When the alarm starts for the first time, the light should aim to have the maximum intensity.
    targetIntensity = highIntensity;
}


function Update ()
{
    // If the light is on...
    if(alarmOn)
    {
        // ... Lerp the light's intensity towards the current target.
        // Mathf.Lerp - static function Lerp(from: float, to: float, t: float): float; -
        // Interpolates between a and b by t. t is clamped between 0 and 1
        light.intensity = Mathf.Lerp(light.intensity, targetIntensity, fadeSpeed * Time.deltaTime);
        
        // Check whether the target intensity needs changing and change it if so.
        CheckTargetIntensity();
    }
    else
        // Otherwise fade the light's intensity to zero.
        light.intensity = Mathf.Lerp(light.intensity, 0f, fadeSpeed * Time.deltaTime);
}


function CheckTargetIntensity ()
{
    // If the difference between the target and current intensities is less than the change margin...
    // Mathf.Abs - static function Abs(f: float): float;
    // Returns the absolute value of f
    if(Mathf.Abs(targetIntensity - light.intensity) < changeMargin)
    {
        // ... if the target intensity is high...
        if(targetIntensity == highIntensity)
            // ... then set the target to low.
            targetIntensity = lowIntensity;
        else
            // Otherwise set the targer to high.
            targetIntensity = highIntensity;
    }
}

Inspector> Alarm Light.js> check ‘Alarm On’… wow it pulses!

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – Stealth Game – Alarm Light

Unity 3D – Stealth Game – Environment Setup

Unity 3D – Stealth Game – Environment Setup

Geometry

1. Import .fbx file with hires Mesh ‘env_stealth_static’
2. ‘Add component’> Mesh Collider> Mesh> assign the lowres Mesh ‘env_stealth_collider’
3. Hierarchy> select + CTRL ‘env_stealth_static’ + ‘env_stealth_collider’> Inspector check ‘Static’ (Unity now knows this object will not move)

Camera

Hierarchy> Main Camera> Inspector> rename camera_main> Camera> Clipping Planes 0.3 – 100

Baked Lights – Points Light

Add Point Light> Inspector> Light> Lightmapping> Baked Only, in questo modo il calcolo NON E’ REALTIME ma calcolato una sola volta all’inizio della scena per megliorare le prestazioni del gioco.

Render Settings

MAIN TOP MENU> Edit> Render Setting> setup parameters

Quality Settings

MAIN TOP MENU> Edit>Project Settings> Quality> setup parameters

Light Mapping

Una LightMap è una mappa di ombre, il motore calcola i punti dove c’è possibilità che si crei un ombra o ci sia un punto di luce.
Il risultato finale non è altro che un’ immagine che andrà poi sulla texture, creando zone di luce e ombra precalcolate.

Se non si calcola la LightMap le luci con attributo ‘Baked Only’ non avranno nessun effetto sulla scena dopo il suo ‘Buil’.

1. MAIN TOP MENU> Window> Light Mapping> Inspector> |Bake|> Mode> Directional Lightmaps and other setups
2. BOTTOM RIGHT> ‘Bake Scene’
ATTENZIONE! Il processo partirà in batch ma il rendering potrebbe richiedere molto tempo perchè è un calcolo in Global Illumination!
3. At the end a Light Map will be applied to Meshes

Real Time Lights – Directional Lights

Unity ha creato un Light Mapping con le luci con il parametro ‘Baked Only’, queste non emettono ombre perchè sono tutte ‘Point light’.
Per generare delle ombre dinamiche devo creare delle ‘Directional Light’, le uniche in Unity in grado di emettere delle ombre.
Le risorse consumate saranno minime perchè useremo al massimo 2 o 3 ‘Directional Lights’ che emetteranno delle vere ombre in tempo reale.

Add Directional Light> Inspector> Light>
| Lightmapping> Real Time Only, in questo modo il calcolo NON VA MAI IN BAKE
| Shadows> Soft Shadows per avere un effetto viasuale di fusione migliore con la LightMap
| Culling Mask> selezionare i livelli che non saranno illuminati da questa luce

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – Stealth Game – Environment Setup

Unity 3D – PickUp – Collecting

Unity 3D – PickUp – Collecting

Player Object

1. Create a Ball (Player) with:
– Sphere Collider -> uncheck ‘Is Trigger’ -> se fosse solo un trigger non colliderebbe più col piano e finirebbe per cadere
– Rigid Body -> check ‘Use Gravity’ -> altrimenti non riusciremo a limitarlo all’interno di una arena
– PlayerController.JS:

#pragma strict
 
function Start () {
count = 0;
SetCountText();   // Setup iniziale GUIText, vedi funzione a fine pagina
winText.text =""; // Testo 'Hai Vinto!' all'inizio è vuoto 
}

// Destroy object with tag = PickUp that enters the trigger START            
    function OnTriggerEnter (other : Collider) {
        if (other.gameObject.tag == "PickUp")
        {             
            other.gameObject.SetActive(false); // Disattivo così non viene contato una seconda volta
            count = count + 1; // incremento il valore di 1 ogni volta che raccolgo un oggetto
            SetCountText(); // aggiorno GUIText
            Destroy(other.gameObject);         // Distruggo per liberare delle risorse di sistema
        }
        }
// Destroy object with tag = PickUp that enters the trigge END

// Theese variables are public to make the code easy-reusable
// You can setup theese variables from Inspector
var speed : float;

private var count : int;
var countText : GUIText; // Setup inside Inspector
var winText : GUIText; // Setup inside Inspector

function FixedUpdate () {
     // Get User Input START
     var moveHorizontal : float= Input.GetAxis ("Horizontal");
     var moveVertical : float= Input.GetAxis ("Vertical");
     // Get User Input END

     var movement : Vector3= new Vector3 (moveHorizontal, 0.0f, moveVertical);
     rigidbody.AddForce (movement * speed * Time.deltaTime); // Time.deltaTime Use this function to make your game frame rate independent
}

// setup del contenuto del GUIText
function SetCountText()
{
    countText.text = "Count: " + count.ToString();
    // Se ho catturato un numero sufficiente di oggetti vinco
    if(count >= 3)
    {
    winText.text = "Hai Vinto!";
    }
}


PlayerController.js> Inspector> change ‘speed’ to 500

PlayerController.js> Inspector> DRAG AND DROP CountText (GUI TEXT) over ‘Count Text’ variable slot

PlayerController.js> Inspector> DRAG AND DROP WinText (GUI TEXT) over ‘Win Text’ variable slot

PickUp Object

2. Create a Cube (PickUp) as ‘Prefab’ to easy duplicate it, with:

SOLUZIONE 1: senza ‘Rigid Body’, lo considera un ‘Collider Statico’, come un muro, e quindi calcola e salva in cache la posizione una volta per tutte, questo ha senso per risparmiare calcoli in caso di un oggetto che non si muove. Se il nostro cubo ruota Unity salva in cache ogni volta la nuova posizione per ogni frame occupando risorse di sistema.
– Box Collider -> check ‘Is Trigger’ -> così non si effettuano calcoli fisici perchè il ‘Trigger’ rileva solo le collisioni senza causare reazioni fisiche

OPPURE

SOLUZIONE 2: applicando un ‘Rigid Body’, lo considera un Collider dinamico, e non salverà dati in cache, occupando meno risorse.
a. Rigid Body> Disabilitare ‘Use Gravity’ per non far cadere l’oggetto. L’oggetto risponde ancora alle sollecitazioni provenienti da altri Collider.
b. Rigid Body> Abilitare ‘Is Kinematic’ per non far calcolare a Unity le reazioni alle sollecitazioni provenienti da altri Collider e ottimizzare il consumo di CPU. Un oggetto ‘Is Kinematic’ può essere spostao utilizzando la funzione ‘Transform’. Questo setup è tipico delle piattaforme mobili di un videogioco ‘platform’.

INOLTRE DEVE AVERE

– Tag ‘PickUp’ -> per distinguere questo tipo di oggetto da tutti gli altri
– Rotator.JS -> per ruotare il cubo

#pragma strict

function Start () {

}

function Update () {
// Time.deltatime, use this function to make your game frame rate independent
transform.Rotate(new Vector3(15,30,45) * Time.deltaTime);
}

Display Text, Win Text

1. Create:

(parent)>DisplayText (EmptyObject)> Transform> Reset

– (child)> CountText (GUI TEXT)> | Transform X=0 Y=1 is Top Left of the Game Viewport
| GUI Text> Pixel Offset X=10 Y=-10

– (child)> WinText (GUI TEXT)> | Transform X=0.5 Y=0.75 is Top Left of the Game Viewport
| GUI Text> Pixel Offset: X=10 Y=-10, Anchor: middle center Alignement: center

Analisi finale

Gli oggetti taggati ‘PickUp’ sono bonus da raccogliere hanno:

– Collider, selezionare ‘Is Trigger’ per non rispondere alle collisioni fisiche

– Rigid Body
a. perchè sono oggetti in movimento e devono essere classificati da Unity come ‘Dynamic Colliders’ per evitare di registrare dati inutili in Cache
b. deselezionare ‘Use Gravity’ perchè non vogliamo che cadano
c. selezionare ‘Is Kinematic’ perchè non devono rispondere all’effetto di forze esterne, per muoverlo NON UTILIZZARE UNA FORZA, ma usare la funzione transform().

– uno script con funzione transform() per ruotare su se stessi all’infinito

L’oggetto ‘Player’, il giocatore controllato dall’utente ha:

– Collider, deselezionare ‘Is Trigger’ perchè deve rispondere a tutte le sollecitazioni fisiche, prima delle quali restare su piano dove si muove

– Rigid Bodi
a. è un ‘Dynamic Colliders’ perchè si muove
b. selezionare ‘Use Gravity’ perchè deve rotolare, cadere etc…
c. deselezionare ‘Is Kinematic’ perchè deve rispondere alle forze esterne, per muoverlo devo applicare una forza NON UTILIZZARE LA FUNZIONE transform().

– uno script ‘PlayerController’ che:
a. usando GetAxis() rileva l’input dell’utente e applica una forza rigidbody.AddForce() al player
b. rileva lo scontro tra player e tutti gli oggetti taggati ‘PickUp’
c. cancella gli oggetti, conta le collisioni, se il numero è sufficiente renderizza la scritta ‘Hai Vinto!’

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – PickUp – Collecting

Unity 3D – PickUp – Rotator

Unity 3D – PickUp – Rotator

1. Create a Cube with Rotator.js

#pragma strict

function Start () {

}

function Update () {
// Time.deltatime, use this function to make your game frame rate independent
transform.Rotate(new Vector3(15,30,45) * Time.deltaTime);
}
By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – PickUp – Rotator

Unity 3D – Camera Controller

Unity 3D – Camera Controller

1. Create a ball that rolls over a plane

2. Creare a Camera with:
– CameraController.js

#pragma strict

public var player : GameObject;
private var offset :  Vector3;

function Start () {
offset = transform.position;
}

function LateUpdate () {
//LateUpdate is called after all Update functions have been called. 
// This is useful to order script execution. For example a follow camera should always be implemented in LateUpdate because it tracks objects that might have moved inside Update.
transform.position = player.transform.position + offset;
}

2. Hierarchy DRAG AND DROP ‘ball’ GameObject over Inspector> CameraController.js ‘player’ variable slot.

By |Unity3D, Video Games Development|Commenti disabilitati su Unity 3D – Camera Controller