Affichage des articles dont le libellé est Input. Afficher tous les articles
Affichage des articles dont le libellé est Input. Afficher tous les articles

lundi 14 novembre 2011

Polyhedron Shower

Après avoir créé le code pour l’instanciation d'un cube, je n'ai pas pu m'arrêter et j'ai continué à ajouter du code. Voici le résultat:
-->

  • RandomObjectCreator.cs: crée les polygones à partir d'un tableau de Transform, les places de manières aléatoires et leurs donnent une vitesse et une rotation aléatoire.
  • RandomColorMaterial.cs: change la couleur et la transparence du matériel. Les belles couleurs viennent de se simple script!
  • Timer.cs: C'est une classe utilitaire qui indique si le délai est écoulé en appelant la fonction trigger.
  • PointLightAtCenter.cs: ce script ajoute une lampe au centre de mes polyèdres. Ce sont ces petites lampes qui ajoutent l'ambiance et font ressortir les couleurs.
  • BounceBack.cs: ce script inverse la vitesse des polyèdres lorsqu'il dépasse une certaine distance du centre.
RandomObjectCreator.cs

using UnityEngine;
using System.Collections;

/**
 * Choose randomly a polyhedron and instantiate it at a random position with
 * a random rotation. After that, add a RigidBody and assign a random force and
 * a random torque to move and rotate the polyhedron.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class RandomObjectCreator : MonoBehaviour 
{
 
 
 public Transform[] _prefab;
 public float _force = 10;
 public float _radius = 10;
 
 // Use this for initialization
 void Start () 
 {
  
 }
 
 // Update is called once per frame
 void Update () 
 {
  
  if ( Input.GetKey("space") )
  {
   //Create a random position.
   //The insideUnitSphere return a random position inside a sphere of radius 1.
   Vector3 rndPos = Random.insideUnitSphere * 10;
   
   //Create a random rotation.
   Quaternion rndRotation = Random.rotation;
   
   //Choose randomly between the array of object
   int choice = (int) Mathf.Floor(Random.Range( 0.0f, _prefab.Length -.0000001f ) );
   
   //Instantiate a new object at a random position with a random rotation.
   Transform newGameObj = Instantiate( _prefab[choice], rndPos, rndRotation) as Transform; 
   
   //Rename the game object.
   newGameObj.name = "Allo";
   
   //Add a rigid body to the object.
   newGameObj.gameObject.AddComponent();
   
   //Remove the gravity.
   newGameObj.gameObject.rigidbody.useGravity = false;
   
   //Change the mass of the object to 1.
   newGameObj.gameObject.rigidbody.mass = 1.0f;
   
   //Add a random impulse to the rigidbody.
   newGameObj.gameObject.rigidbody.AddForce(new Vector3( Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force) ), 
                                                 ForceMode.Impulse);
   
   //We add a random torque to the rigidbody to make him rotate!!!
   newGameObj.gameObject.rigidbody.AddTorque(new Vector3( Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force), 
                                                         Random.Range(-_force,_force) ), 
                                                 ForceMode.Impulse);
  }
  else if ( Input.GetKey("q") )
  {
   Application.Quit();
  }
  else if ( Input.GetKeyDown("return") )
  {
   GameObject[] objs = GameObject.FindGameObjectsWithTag ("Block");
   foreach ( GameObject obj in objs)
   {
    Destroy(obj);
   }
  }
 }

}

Licence Creative Commons
RandomObjectCreator.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.  

RandomColorMaterial.cs

using UnityEngine;
using System.Collections;

/**
 * Randomly assign a color and an alpha to the material of the object.
 * 
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class RandomColorMaterial : MonoBehaviour
{

 
 // Use this for initialization
 void Start ()
 {
  
  Shader shader1 = Shader.Find("Transparent/Diffuse");
  
  this.renderer.material.shader = shader1;
  
  //Set the main color of the material
  this.renderer.material.color = CreateRandomColor();
  
 }
 
 private Color CreateRandomColor()
 {
  float r = Random.value;
  float g = Random.value;
  float b = Random.value;
  float a = Random.Range(.4f,1f);
  
  return new Color( r, g, b, a );
 }
}
Licence Creative Commons
RandomColorMaterial.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.

Timer.cs

using System;
using UnityEngine;

/**
 * Timer with a delay. When the delay is over by, the trigger properties will
 * return true.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
namespace Utils
{
 public class Timer
 {
  private float _timer;
  private float _delay;
  
  
  public void Start(  )
  {
   this.Reset();
  }
  
  public void Start( float delay )
  {
   _delay = delay;
   this.Reset();
  }
  
  public float time
  {
   set { _timer = value; } 
  }
  
  public float delay
  {
   get { return _delay; }
   set { _delay = value; }
  }
  
  public void Reset()
  {
   _timer = Time.time; 
  }
  
  public bool overBy
  {
   get { return (Time.time - _timer) >= _delay; }
  }
  
  public bool underBy
  {
   get { return (Time.time - _timer) < _delay; }
  }
  
  /**
   * When called, this properties return if the timer is overBy or underBy and
   * reset the timer.
   */
  public bool trigger
  {
   get
   {
    if ( overBy )
    {
     Reset();
     return true; 
    }
    else
    {
     return false;
    }
   }
  }
  
 } //End class
} //End namespace


Licence Creative Commons
Timer.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.
 
PointLightAtCenter.cs

using UnityEngine;
using System.Collections;

/**
 * Add a point like in the center of an object.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class PointLightAtCenter : MonoBehaviour
{
 public float _range = 5f;
 
 // Use this for initialization
 void Start ()
 {
  //Add a point light in the center of the object.
  Light spot = this.gameObject.AddComponent();
  spot.type = LightType.Point;
  spot.range = _range;
  spot.intensity = 2;
 }

}


Licence Creative Commons
PointLightAtCenter.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.
 
BounceBack.cs
 
using UnityEngine;
using System.Collections;
using Utils;

/**
 * Inverse the velocity of an object that is at a distance greater
 * than the specified radius.
 *
 * @author Mentalogicus
 * @date 11-2011
 * 
 * Copyright (C) 2011, Mentalogicus
 * All rights reserved
 * 
 */
public class BounceBack : MonoBehaviour 
{
 
 public float _radius = 50;
 
 private Timer _timeToReturnBack = new Timer( );
 
 void Start()
 {
  _timeToReturnBack.Start( .2f );
 }
 
 // Update is called once per frame
 void Update () 
 {
  if ( this.transform.position.x * this.transform.position.x +
       this.transform.position.y * this.transform.position.y +
       this.transform.position.z * this.transform.position.z > _radius * _radius &&
       _timeToReturnBack.trigger )
  {
   this.rigidbody.velocity = -this.rigidbody.velocity;
  }
 }
}

Licence Creative Commons
BounceBack.cs de Mentalogicus est mis à disposition selon les termes de la licence Creative Commons Paternité - Pas de Modification 3.0 non transposé.

Comment instancier des objets dans Unity 3D?

Unity 3D est un engin de jeux complets avec un éditeur. Si Unity vous est totalement inconnu, je vous recommande de visiter leur site: http://unity3d.com/. Ce tutoriel assume que vous avez déjà un peu joué avec Unity 3D et que vous êtes familier avec l'interface. Les scripts sont en C#. Le but du tutoriel est d'apprendre à instancier des objets durant l'exécution du jeu et non dans l'éditeur.
L'éditeur d'Unity.
La première étape consiste à créer un nouveau projet dans Unity. Je l'ai appelé "RandomObjectsCreator". À la création du projet, Unity crée les répertoires Assets, Library et Temp. Le répertoire Assets sert de librairie pour les objets que nous ajoutons aux jeux. C'est le seul des trois répertoires que nous allons utiliser.

L'instanciation d'objet dans Unity se fait à l'aide de prefabs. Prefab est la version raccourcie de Préfabriquée. Le prefab est l'équivalent d'un plan de construction. L'objet a telle forme, telle couleur et va réagir de telle et telle façon dans telles et telles conditions. Une fois le prefab créé, il est possible de créer des milliers de versions du même objet à l'intérieur du jeu et chaque objet aura la forme et le comportement spécifié dans le prefab.

Pour créer un prefab, aller dans l'onglet Projet->click droit->Create->Prefab. Renommer ce prefab "Cube".
Menu pour la création d'un prefab.
L'icône du prefab est une boîte blanche vide. Cette icône indique que le prefab est vide. Pour le remplir, nous allons ajouter un cube à la scène. Dans le menu supérieur: GameObject->Create Other->Cube.
Création d'un cube dans Unity.
Dans le menu "Hierarchy", sélectionnez Cube et glissez le sur le prefab Cube. L'icône du prefab devient une boîte bleue, indiquant que le prefab contient un objet. Vous pouvez maintenant effacer le Cube de la scène. Si vous glissez le prefab Cube sur la scène, un cube apparaît! Magika!
Ajout d'un objet au prefab.
Il est temps de créer notre script. Dans le tab "Project", click droit->Create->C# Script. Nommons-le: "RandomObjectsCreator". En double cliquant sur le script, l'éditeur par défaut de Unity ouvre le script. Dans mon cas, c'est MonoDevelop qui est ouvert. Unity a créé automatiquement une classe nommée RandomObjectsCreator avec la fonction Start et la function Update:

using UnityEngine;
using System.Collections;

public class RandomObjectsCreator : MonoBehaviour 
{

 // Use this for initialization
 void Start () 
 {
 
 }
 
 // Update is called once per frame
 void Update () 
 {
 
 }
}

La classe hérite de la classe générique MonoBehavior. Les scripts attachés sur des objets dans la scène doivent obligatoirement hériter de MonoBehavior pour fonctionner. La classe MonoBehavior permet d'accéder aux propriétés et aux composants de l'objet auquel est attaché le script.

Le code pour instancier un prefab est:
Instantiate( _prefab, position, rotation);
La fonction Instantiate va créer un clone du prefab contenu dans la variable _prefab, l'afficher dans la scène à la position "position" avec la rotation "rotation" et va retourner une référence de l'objet avec le type Object. Le type Object est le type de base en C#. Dans le précédent code, nous n'avons pas mis de variable pour récupérer la référence à l'objet. Pour ce faire, le code sera:
Transform newGameObj = 
     Instantiate( prefab, position, rotation) as Transform; 
Transform est un type générique d'Unity qui permet d'accéder à toutes les propriétés de l'objet de la scène. Le as Transform est un casting. Instantiate retourne une référence de type Object. Or, nous voulons une référence de type Transform. Nous indiquons la transformation de la référence de type Object en une référence de type Transform avec le as Transform. Il est à remarquer que cette notation est identique à la suivante:
Transform newGameObj = 
     (Transform)Instantiate( _prefab, position, rotation); 
Personnellement, je préfère le as, car c'est plus proche de l'anglais que l'opérateur de casting avec parenthèse.

Pour faire apparaître un cube, le joueur doit peser sur la touche espace. Le code est entré dans la fonction Update qui est appelée chaque fois que l'écran est rafraichi. La commande nécessaire est:
Input.GetKey("space");
Cette fonction retourne vrai si la touche espace est enfoncée et faux autrement. La position de notre cube sera choisi aléatoirement dans une sphère d'un rayon déterminé par la variable _radius:
Vector3 rndPos = Random.insideUnitSphere * _radius;
et avec une rotation aléatoire:
Quaternion rndRotation = Random.rotation;
Le script complet est le suivant:
using UnityEngine;
using System.Collections;

public class RandomObjectsCreator : MonoBehaviour 
{
 public Transform _prefab;
 public float _radius = 10;
 
 // Update is called once per frame
 void Update () 
 {
  if ( Input.GetKey("space") )
  {
   //Create a random position.
   //The insideUnitSphere return a random position inside a sphere of radius 1.
   Vector3 rndPos = Random.insideUnitSphere * _radius;
   
   //Create a random rotation.
   Quaternion rndRotation = Random.rotation;
   
   //Instantiate a new object at a random position with a random rotation.
   Transform newGameObj = Instantiate( _prefab, rndPos, rndRotation) as Transform; 
  }
 }
}

Ce script doit être attaché à un GameObject dans la scène pour fonctionner. Nous allons créer un GameObject vide. Dans le menu GameObject->Create Empty.Un objet nommé GameObject est crée. Renommons le ObjectsCreator. Sélectionner ObjectsCreator et glisser le script RandomObjectsCreator dans l'onglet Inspector. Le script contient deux variables prefab, radius. Glisser le prefab Cube sur le none à droite de la variable prefab. Le nom Cube apparaît avec une icône de manipulateur 3D.
Ajout d'un script et assignation de la variable prefab aux prefab Cube.
Appuyer sur Play et ensuite sur la touche "espace". Des cubes vont apparaître aléatoirement à l'écran. Je vous recommande d'ajouter une lampe directionnelle dans la scène pour embellir votre rendu.
-->