Faire pivoter une texture quand le perso change de sens (2D)

Questions techniques liées à l’utilisation d'Unity (et n'entrant pas dans le cadre d'une des sections suivantes)
Répondre
error404
Messages : 160
Inscription : 13 Nov 2010 07:51
Contact :

Faire pivoter une texture quand le perso change de sens (2D)

Message par error404 » 05 Jan 2011 14:49

Bonjour,
Je suis en train de faire un jeu en vue 2D avec ma caméra qui regarde mon personnage marcher. J'ai mis une texture sur un plane qui représente mon personnage. Je voudrais que quand je marche vers la droite la texture soit orientée vers la droite et pour la gauche qu'elle pivote de 180°. Je ne peux pas faire tourner mon personnage car sinon ma caméra va aussi tournée et le filmer dans le sens inverse, il faudrait que je modifie le tiling du shader et mettre x en -1. Comment faire ?

J'avais essayé une autre technique en modifiant le localScale comme ceci :

Code : Tout sélectionner

if (Input.GetKey("left"))
{
//coco est mon perso
  coco.transform.localScale.x = 1;  
}
if (Input.GetKey("right"))
{
  coco.transform.localScale.x = -1;   
}
Mais c'est pas bon du tout cas ca fait une symétrie, si je suis à 5 mètres vers la droite et que j'appuie sur gauche, mon perso se retrouve à -5 mètre à gauche, c'est horrible.

En espérant que vous puissiez m'aider, je vous en serais reconnaissant. Merci.

Avatar de l’utilisateur
GeoDec
Messages : 38
Inscription : 03 Sep 2010 18:55

Re: Faire pivoter une texture quand le perso change de sens

Message par GeoDec » 05 Jan 2011 22:46

Salut!

Tu peux utiliser la fonction SetTextureScale:

Code : Tout sélectionner

if (Input.GetKey("left"))
{
   renderer.material.SetTextureScale ( "_MainTex" , Vector2(1,1));
   coco.transform.position.x = coco.transform.position.x + 1;   
}
if (Input.GetKey("right"))
{
   renderer.material.SetTextureScale ( "_MainTex" , Vector2(-1,1));
   coco.transform.position.x = coco.transform.position.x - 1;   
}
Sinon un localscale fonctionne très bien si on modifie la position globale de l'objet:

Code : Tout sélectionner

if (Input.GetKey("left"))
{
   coco.transform.localScale.x = 1;
   coco.transform.position.x = coco.transform.position.x + 1;   
}
if (Input.GetKey("right"))
{
   coco.transform.localScale.x = -1;  
   coco.transform.position.x = coco.transform.position.x - 1;   
}

error404
Messages : 160
Inscription : 13 Nov 2010 07:51
Contact :

Re: Faire pivoter une texture quand le perso change de sens

Message par error404 » 06 Jan 2011 08:38

Merci beaucoup, j'ai pas testé, mais ca me semble bon. Je vais préféré la seconde méthode (car c'est celle que j'ai essayé de faire et qui m'a tenu tête), en revanche, je veux bien que tu m'explique les 2 paramètres que tu as utilisé dans la première méthode "_MainTex" , Vector2(1,1). Que représentent ils, a quoi servent ils ?
A bientot.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Faire pivoter une texture quand le perso change de sens

Message par giyomuSan » 06 Jan 2011 16:11

le premier paramtere c la texture qui se trouve sur el material , et si tu regarde ds le code du shader tu verra que son appelation c'est _MainTex, qd il y a juste un seul slot pour la texture.

le Vector2, je pense que c simplement les coordonnees UV de la texture ( qui sont toujours comprise entre 0 et 1 ), donc a -1 pour Vector2(-1,1) tu retourne ta texure ( un mirroir si tu prefere ) sur U ( en gros tu peu assimiler a X )

error404
Messages : 160
Inscription : 13 Nov 2010 07:51
Contact :

Re: Faire pivoter une texture quand le perso change de sens

Message par error404 » 07 Jan 2011 17:14

Merci pour les précisions, malheureusement les scripts ne fonctionnent pas, ils font déplacés mon personnage extrêmement vite et la texture ne se retourne pas. Il faut savoir que j'utilise le characterMotor pour le déplacement.

Avatar de l’utilisateur
GeoDec
Messages : 38
Inscription : 03 Sep 2010 18:55

Re: Faire pivoter une texture quand le perso change de sens

Message par GeoDec » 07 Jan 2011 20:37

si tu utilise character motor il faut evidement ne pas rajouter de transform.position dans ton script étant donné qu'il transforme déja l'objet.

Par contre pour la texture je comprend pas. La fonction SetTextureScale fonctionne bien normalement.
Il faudrait que tu montre ton script et ta hyérachie.

error404
Messages : 160
Inscription : 13 Nov 2010 07:51
Contact :

Re: Faire pivoter une texture quand le perso change de sens

Message par error404 » 07 Jan 2011 22:23

Alors la texture ne pivote pas même sans les deux lignes. Je vais mettre deux scripts et une copie d'écran de ma hiérarchie. Le premier script sera le script en question qui ne fonctionne pas, et le second script est le script que j'utilise pour animer une planche de sprite afin de faire marcher mon personnage.

limiteZ.js

Code : Tout sélectionner

	private var coco:GameObject;
	coco=GameObject.Find("persoCoco");
	
	
function Update () {
if (transform.position.z < -0.2 || transform.position.z > -0.2)
transform.position.z = -0.2;

if (Input.GetKey("left"))
{
renderer.material.SetTextureScale ( "_MainTex" , Vector2(1,1));
}
if (Input.GetKey("right"))
{
renderer.material.SetTextureScale ( "_MainTex" , Vector2(-1,1));
}
}
planeS.js

Code : Tout sélectionner

//vars for animation
var rowNumber   : int =  0; //Zero Indexed ( Ligne  de la première "cellule" affichée)
var colNumber   : int =  0; //Zero Indexed ( Colonne de la première "cellule" affichée)
var totalCells  : int =  7; // (Nombre total de cellules affichées. 4, le maxi pour un ligne complète. )
var fps  : int = 35; // vitesse du défilement. Donc de l'affichage des cellules

var offset  : Vector2;  //Maybe this should be a private var

//Update
function Update () { SetSpriteAnimation(colCount,rowCount,rowNumber,colNumber,totalCells,fps);  }

//SetSpriteAnimation
function SetSpriteAnimation(colCount : int,rowCount : int,rowNumber : int,colNumber : int,totalCells : int,fps : int){

    // Calculate index
    var index : int = Time.time * fps;
    // Repeat when exhausting all cells
    index = index % totalCells;
   
    // Size of every cell
    var size = Vector2 (1.0 / colCount, 1.0 / rowCount);
   
    // split into horizontal and vertical index
    var uIndex = index % colCount;
    var vIndex = index / colCount;

    // build offset
    // v coordinate is the bottom of the image in opengl so we need to invert.
    offset = Vector2 ((uIndex+colNumber) * size.x, (1.0 - size.y) - (vIndex+rowNumber) * size.y);
   
    renderer.material.SetTextureOffset ("_MainTex", offset);
    renderer.material.SetTextureScale  ("_MainTex", size);
}
screen :

http://img211.imageshack.us/img211/7602/jeus.png

Image

Merci.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Faire pivoter une texture quand le perso change de sens

Message par giyomuSan » 08 Jan 2011 07:16

ton grand tord c 'est d avoir la camera parenter a ton perso, tu te creerais moins de soucis en la desolidarisant du perso et en creant un simple script qui fais suivre la camera sur les position XY de ton perso ( en plus ca te permettrais d y ajouter certain effets au passage )

le character motor pour un jeu de type 2 / 2.5D aussi c pas un peu overkill...alors qu'un simple script utilisant du vecteur 2D facon 8bit game ferait certainement tres bien l affaire.

sinon pour ton soucis , conseil c'est de prendre les chose pas a pas , moi ce que je fais quand je suis pas sur d un trcu ou veux faire quelques test c de me creer une scene special pour ca pour tester vite fais des petit bout de fct une a une, voir si elle fonctionne comme je pense et de la assembler le tout, comme ca quand un truc casse tu est capable de definir a quel niveau ca coince.

Donc essaye deja de voir si tu arrive a inverser ta texture simplement sans etre polluer par le reste de tes scripts, une fois ca acquis tu peu apres commencer a assembler avec le reste

error404
Messages : 160
Inscription : 13 Nov 2010 07:51
Contact :

Re: Faire pivoter une texture quand le perso change de sens

Message par error404 » 08 Jan 2011 08:35

Je ne suis pas sur d'avoir compris pour la caméra... J'utilise le smooth follow pour suivre le personnage.

Après je ne connais pas assez Unity, alors parfois je ne sais pas comment faire les choses simplement. Je vais essayer de créer une scène de test, ce sera bien.

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Faire pivoter une texture quand le perso change de sens

Message par giyomuSan » 08 Jan 2011 11:12

etudie plus les script que tu utilise , tu peu faire en sorte de retirer la partie concernant les rotation sur ce script sur les axes que tu veux, comme ca ta cam ne s occupera que de la position et pas les rotations de ton perso ;)

Répondre

Revenir vers « Unity le logiciel »