Unity3D : gestion des bords de l’écran

Définition du problème

J’ai passé quelques temps à comprendre comment gérer la détection des bords de l’écran pour ne pas que mon gameobject en sorte.

Dans mon cas le gameobject dirigé par le joueur est un cube auquel on ajoute un BoxCollider, la caméra est fixe.

Dans Unity on gère la position d’un objet par son attribut position (un Vector3 donnant le positionnement du centre de l’objet).

Malheureusement pour moi le composant camera de Unity permet seulement de trouver la taille en pixels de l’écran (maCamera.pixelHeight et maCamera.pixelWidth) et donc je me suis mis à chercher un moyen de déterminer en pixel l’endroit où se trouve mon cube afin de savoir si celui-ci est en dehors ou en dedans de l’écran. En gros si mon cube est entièrement visible ou non !

De l’intérêt d’utiliser un BoxCollider

Pour déterminer le centre de mon cube ainsi que sa taille j’utilise les valeurs récupérables dans l’attribut bounds du composant :

//dans start()
joueurX = this.GetComponent<Collider>().bounds.size.x/2;
joueurY = this.GetComponent<Collider>().bounds.size.y/2;

//dans update()  centreJoueurX = this.GetComponent<Collider> ().bounds.center.x; centreJoueurY = this.GetComponent<Collider> ().bounds.center.y; 

Aux tests à effectuer

if (maCamera.WorldToScreenPoint(new Vector3(0,(centreJoueurY+joueurY),0)).y > pixelHeight) {
//on stop le déplacement
directionJoueur = 0;
this.gameObject.transform.localPosition += (-mouvementY * speed * Time.deltaTime);
} 
else if (maCamera.WorldToScreenPoint(new Vector3(0,(centreJoueurY-joueurY),0)).y  < 0) {
directionJoueur = 0;            this.gameObject.transform.localPosition += (mouvementY * speed * Time.deltaTime);
} 
else if (maCamera.WorldToScreenPoint(new Vector3((centreJoueurX+joueurX),0,0)).x > pixelWidth) {
directionJoueur = 0;             this.gameObject.transform.localPosition += (-mouvementX * speed * Time.deltaTime);
}
else if (maCamera.WorldToScreenPoint(new Vector3((centreJoueurX-joueurX),0,0)).x < 0) {
directionJoueur = 0;                                           this.gameObject.transform.localPosition += (mouvementX * speed  * Time.deltaTime);
}


Voilà pour le système utilisé actuellement, on peut bien entendu imaginer un système pour ne pas refaire les tests à chaque update() mais uniquement au moment voulu.

Blender : Modifier le centre d’un objet (version avant 2.80)

La problématique est la suivante : comment modifier le centre d’un objet 3D dans Blender ?

Cas pratique : Dans l’utilisation des modélisations faite dans Blender dans un moteur de jeu comme Unity, sa position est définie par le centre de l’objet et ses coordonnées (x=0,y=0,z=0).

Dans le cas présent nous voulons pouvoir placer des arbres de différentes tailles sur des blocs de sol à une position donnée. Le centre de l’objet doit donc être placé au bas de ceux si et le socle de l’arbre rapproché le plus possible de l’origine de l’axe perpendiculaire à l’axe de pousse de l’arbre dans le cas présent.

Place aux images et aux explications !

  1. Ouvrez votre objet et passez en « Edit Mode » en appuyant sur Tabulation par exemple, sélectionnez le Vertex (le sommet) clic droit, puis appuyez sur la touche Espace et écrivez « Snap « , une liste devrez apparaître dans laquelle vous sélectionnerez « Snap Cursor To Selected » (Je vous laisse essayer les autres options pour les découvrir par vous même)SnapCursorTo
  2. Ensuite repassez en Object Mode en ré-appuyant sur Tabulation. Une fois fait allez sur votre droite dans l’onglet « Tools » et sélectionnez « Set Origin », « Origin to 3D Cursor »OriginTo3DCursor
  3. Maintenant passez en vue de côté en appuyant sur 1 ou 3 et déplacez votre objet sur l’axe voulu jusqu’à la limite voulue !ToTheAxe
  4. Voilà vous avez déplacer l’Origine de l’objet en un point voulu :)
    Astuce si vous voulez déplacer plus au centre (ici du tronc) votre origine vous pouvez dupliquer un vertex seul, le placer au centre et refaire la manipulation