[Résolu] Texture swap animator et clique de souris

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Balt
Messages : 4
Inscription : 31 Juil 2013 13:02

[Résolu] Texture swap animator et clique de souris

Message par Balt » 31 Juil 2013 14:02

Bonjour,

J'essaie de réaliser un jeu en reprenant à peu près le gameplay de Doom. Se faisant j'ai créé une série d'images pour l'animation du tir. Les images sont attribuées à un material, lui-même attribué à un objet placé devant la camera.

Le script associé à l'objet donne ça : (en utilisant le "Texture Swap Animator" (http://wiki.unity3d.com/index.php?title ... p_animator) )

Code : Tout sélectionner

var uvAnimationTileX = 24; //Here you can place the number of columns of your sheet. 
                           //The above sheet has 24
 
var frames : Texture2D[];
var framesPerSecond = 24;
 

function Update ()
{
	
	if(Input.GetButton("Fire1") == true)
	{
	
	Shoot ();
	}
	
	if(Input.GetButton("Fire1") == false)
	{
	renderer.material.mainTexture = frames[0];	
	}
	
}


function Shoot ()
{
	var index : int = Time.time * framesPerSecond;
	index = index % frames.Length;
	renderer.material.mainTexture = frames[index];
		
}

Alors l'animation fonctionne très bien, mais le problème c'est qu'elle ne se lance que lorsque le bouton de la souris reste appuyé.
Je n'arrive pas à faire en sorte que "un clic" soit équivalent à "l'animation se joue une fois en entier".

Quelqu'un aurait-il une idée ?
Dernière édition par Balt le 31 Juil 2013 23:55, édité 1 fois.

Josk
Messages : 20
Inscription : 27 Fév 2013 19:24

Re: Texture swap animator et clique de souris

Message par Josk » 31 Juil 2013 14:24

Bonjour,
Dans ton cas, la fonction GetButton("Fire1") ne retourne true que tant que tu appuis sur ta touche de tir(ton clic donc).
Tu fais défiler ton animation avec la fonction Shoot. Lorsque tu arrêtes d'appuyer, ta fonction Shoot ne s'appelle plus.
Pour te guider dans ta réflexion, tu devrais plutot dans ta fonction de tir avoir un indicateur qui dit "J'ai cliqué sur la touche de tir" et la tu executes ta fonction de shoot tant que toute ton animation n'a pas été jouée.

Balt
Messages : 4
Inscription : 31 Juil 2013 13:02

Re: Texture swap animator et clique de souris

Message par Balt » 31 Juil 2013 21:28

Alors, j'ai modifié le script :

Code : Tout sélectionner


function Update ()
{
	
	if(Input.GetButton("Fire1") == true)
	{
	shootOK = true;
	}
	
	Shoot ();
	
	if (renderer.material.mainTexture == frames[23])
	{
	shootOK = false;
	}
	
	if(shootOK == false)
	{
	renderer.material.mainTexture = frames[0];	
	}
	
}


function Shoot ()
{
	if(shootOK == true)
	{
	var index : int = Time.time * framesPerSecond;
	index = index % frames.Length;
	renderer.material.mainTexture = frames[index];
	}
	
}

Mais le résultat n'est pas vraiment satisfaisant : parfois l'animation saute plusieurs images, de façon aleatoire.
Pour que que ce soit plus clair, j'ai fait une capture d'écran video : http://youtu.be/yQYLoKbEdOA


J'avoue n'avoir que peu d'expérience en matière de programmation. Du coup mon problème peut paraître assez simple, mais je reste assez perplexe quant aux raisons du dysfonctionnement et de la manière de le résoudre.

Josk
Messages : 20
Inscription : 27 Fév 2013 19:24

Re: Texture swap animator et clique de souris

Message par Josk » 31 Juil 2013 22:36

Tu as déja fait plus que la plupart des gens sur ce forum.

j'ai bien regardé ton code et pour le coups je ne vois pas. J'avais pensé à mettre GetButtonUp à la place de GetButton mais je pense que ça ne changera rien :s

Si quelqu'un passe et qu'il trouve j'aimerai bien savoir aussi

Avatar de l’utilisateur
Amethyste
Messages : 136
Inscription : 30 Mai 2013 22:37
Localisation : Vendée

Re: Texture swap animator et clique de souris

Message par Amethyste » 31 Juil 2013 22:43

Bonjour

Tu peux rajouter un test pour savoir si ton animation est joué et interdire le tir si l'animation est entrain d’être jouée, ca évitera les "sauts" d'animation

Pour faire çà tu met ton animation dans une variable

Code : Tout sélectionner

var anim : animation
et tu teste si l'animation est jouée

Code : Tout sélectionner

if(!anim.isplaying)
ça devrais le faire

Balt
Messages : 4
Inscription : 31 Juil 2013 13:02

Re: Texture swap animator et clique de souris

Message par Balt » 31 Juil 2013 23:23

Je ne peux rien associer à une telle variable puisque qu'il ne s'agit pas d'une animation à proprement parler, mais d'une suite de textures différentes qui s'enchaînent dans le matérial.

Les sautes d'images sont sensées être empêchées par la variable "shootOK", qui devient vrai lorsque la suite d'images se lance et ne redevient fausse que lorsque l'image 23 (la dernière) est atteinte. De sorte que les clics faits pendant l'anim n'ont théoriquement pas d'effets.

Mais comme tu peux le voir, ça n'a pas l'air d'être aussi simple.

Avatar de l’utilisateur
artemisart
Messages : 1893
Inscription : 21 Juin 2011 19:51
Localisation : Centre
Contact :

Re: Texture swap animator et clique de souris

Message par artemisart » 31 Juil 2013 23:27

@Amethyste: l'animation n'est pas gérée par la classe Animation d'unity, c'est donc pas possible.

@Balt: Il faut que tu utilise GetButtonDown (et une coroutine tant qu'a faire, c'est limite plus simple).
Ça donne ça:

Code : Tout sélectionner

#pragma strict

var frames : Texture[];
var framesPerSecond : int = 24;
private var isPlaying : bool;
private var index : int;

function Update ()
{
	if (!isPlaying && Input.GetButtonDown ("Fire1"))
		LaunchAnimation ();
}

function LaunchAnimation ()
{
	isPlaying = true;
	while (++index < frames.Length)
	{
		renderer.material.mainTexture = frames[index];
		yield return WaitForSeconds (1f / framesPerSecond);
	}
	index = 0;
	renderer.material.mainTexture = frames[index];
	// si on aime les syntaxes (très) légèrement exotiques, on peut remplacer les 2 dernières lignes par :
	// renderer.material.mainTexture = frames[index = 0];
	isPlaying = false;
}
(j'ai rien testé ni compilé mais normalement ça devrait le faire)

Balt
Messages : 4
Inscription : 31 Juil 2013 13:02

Re: Texture swap animator et clique de souris

Message par Balt » 31 Juil 2013 23:52

Oh super, ça marche à merveille!

Juste un truc :

à la ligne " yield return WaitForSeconds (1f / framesPerSecond);" Je ne sais pas ce que tu avais en tête en écrivant le mot "return" (en quoi est-ce différent d'un yield WaitForSeconds tout court ?), mais il semble inutile, j'ai dû l'effacer pour pouvoir lancer un test.

Merci beaucoup !
Dernière édition par Balt le 01 Août 2013 00:00, édité 1 fois.

Josk
Messages : 20
Inscription : 27 Fév 2013 19:24

Re: Texture swap animator et clique de souris

Message par Josk » 31 Juil 2013 23:56

Ca changera rien les gars, c'est juste un booleen donc si ça passe tout le temps dans la première condition ça fera que laisser le booleen à true. Et comme sa deuxieme condition vérifie où il en est dans les frame, ça repassera toujours à false à la fin.

Par contre, une idée: Passe index en variable globale de ta classe. parce qu'en fait la c'est réinitialisé à chaque fois, j'avais pas noté ça tout à l'heure, je me demande si ça a pas un impact.

EDIT: Ah bah nan xD

Répondre

Revenir vers « Scripting »