Voici des fonctions pour filtrer les valeurs de l’accelerometre dans unity.
Elles sont inspirées des fonctions de la doc officielle qui ne sont pas fonctionnelles sur mes tests dans Unity 3.x.

var AccelerometerUpdateInterval : float = 1.0 / 60.0;
var LowPassKernelWidthInSeconds : float = 1.0;

private var LowPassFilterFactor : float = AccelerometerUpdateInterval / LowPassKernelWidthInSeconds; // tweakable
private var lowPassValue : Vector3;
function Start () {
	lowPassValue.x = Input.acceleration.x;
	lowPassValue.y = Input.acceleration.y;
	lowPassValue.z = Input.acceleration.z;
}

function LowPassFilterAccelerometer() : Vector3 {
	lowPassValue.x = Mathf.Lerp(lowPassValue.y, Input.acceleration.x, LowPassFilterFactor);
	lowPassValue.y = Mathf.Lerp(lowPassValue.y, Input.acceleration.y, LowPassFilterFactor);
	lowPassValue.z = Mathf.Lerp(lowPassValue.y, Input.acceleration.z, LowPassFilterFactor);
	return lowPassValue;
}

Donc par exemple, au lieu de :

var acceleroX:float = Input.acceleration.x;

On utilise :

var acceleroX:float = LowPassFilterAccelerometer().x;

Récupérer les valeurs des touches directionnelles

// 0 si inutilisé, 1 ou -1

//Axe vertical (haut/bas)
Input.GetAxis("Vertical");
//Axe horizontal
Input.GetAxis("Horizontal");

Convertir la position locale en position globale

// localPosition du type Vector3
globalPosition = transform.TransformDirection(localPosition);

Convertir la position locale en position globale

// localPosition du type Vector3
globalPosition = transform.TransformDirection(localPosition);

Récupérer un composant

GetComponent(composant);

Nous allons voir un exemple simple et concret, une partie du script natif d’Unity First Person Controler :

var speed = 6.0; 
private var jumpSpeed = 8.0;
var gravity = 20.0;
private var moveDirection = Vector3.zero; // Stocke la direction du joueur
private var grounded:boolean = false; // Signale si le joueur est en contact avec le sol

// Identique à la fonction Update(), mais n'est pas dépendante du nombre d'images par seconde
function FixedUpdate(){
// Le joueur est bien en contact avec le sol
if(grounded) {
// On récupère dans un vecteur temporaire (défini sur la position locale) les entrées des touches directionnelles
moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
// On transforme le vecteur local en vecteur global
moveDirection = transform.TransformDirection(moveDirection);
// On multiplie par le coefficient de vitesse
moveDirection *= speed;
// Si le joueur appuie sur la touche de saut
if(Input.GetButton ("Jump")) {
 moveDirection.y = jumpSpeed;
}
}

Activer la collision avec un objet

function OnControllerColliderHit(hit : ControllerColliderHit){
if(hit.gameObject.tag == "tagdelobjet"){
// Action(s)
objetTouche = hit.gameObject;

}
}

Afficher le contenu d’une variable dans la console:

Debug.Log(variable);

Récupèrer une occurence de la scène en javascript :

var monObjet = GameObject.Find("nomDeLObjet");

Faire disparaitre un objet de la scène :

occurenceDeLObjet.renderer.enabled=false;

Créer un bouton:

function OnGUI(){
if(GUI.Button(Rect(CoordX, CoordY, Largeur, Hauteur), "texte du bouton")){
// Action sur l'événement on click
}
}

Mise en place d’un trigger :

// Script dans un objet en mode "trigger"
var prefab.Transform;// On dois attribuer un objet à cette variable

function OnTriggerEnter(other: Collider){
// On execute la gravité d'un objet par exemple
prefab.rigidbody.useGravity = true;
}

« Transformer » un objet :

// Déplacement sur x
objet.transform.positionx = valeur;
// Déplacement sur 3 dimensions
objet.transform.position = Vector3(valeurX, valeurY, valeurZ);
// Rotation
objet.transform.Rotate(valeurX, valeurY, valeurZ);

Fonction incrémentale basée sur le temps :

Time.deltaTime;

Faire pivoter un objet en continu

// Script à inclure dans l'objet que l'on veux faire pivoter

// Vitesse de rotation de l'objet
var rotationAmount : float = 5.0;

function Update () {
	var translationY:float = Time.deltaTime;
	transform.Rotate(Vector3(0, rotationAmount, 0));
}

Raycasting

// Création du rayon (Point D'émission du rayon, direction du rayon, variable stockant les données du rayon, longueur du rayon en mètres)
	if(Physics.Raycast (transform.position, transform.forward, hit, 5)) {
		if(hit.collider.gameObject.tag=="tagDeLObjet" ){
			// Récupèration de la cible
			currentObject = hit.collider.gameObject;
		}
	}

Jouer un son une seule fois

// Variable publique, donc on peux la lier en drag & drop à un element du projet par exemple
var sound : AudioClip;
// On lance le son qu'une seule fois
audio.PlayOneShot(sound);

Lancer une animation définie dans le FBXImporter

	// On récupère l'objet
	var oiseau: GameObject = GameObject.Find("oiseau");
	// Et on lance l'animation
	oiseau.animation.Play("vole");

Annotations

@script RequireComponent(AudioSource);

Aucune originalité dans cette scène, je me suis totalement inspiré d’un fond d’écran que j’ai vu « traîner » un jour.

Je n’ai pas voulu trop surcharger la scène par faute de temps, mais sûrement que j’augmenterais le nombre de tux pour un meilleur rendu.

L’effet de profondeur est réalisé sous photoshop pour gagner du temps. Sinon il peux être réalisé avec les nodes directement sous blender. Je réaliserais sûrement un tuto pour cet effet un jour, mais il en existe déjà un bon nombre, et des plus simplistes.

Voici une version 1920 x 1080 pour un fond d’écran.

MAJ! Nouveau rendu avec DOF géré directement sous yafaray.