Page 1 sur 5

[Résolu] Animation de portes glissantes qui se décalent

Publié : 03 Déc 2019 19:33
par freepl
Bonjour

(J'ai mis AL, mais je ne crois pas que l'animation entre dans ce domaine)


J'ai fait un sas avec 2 portes coulissantes. Le mouvement se fait sur 3 secondes.
Un cube trigger est activé par un personnage se qui lance l'animation d'ouverture et de fermeture des portes.
animation simple de déplacement sur Ox de +0.45 cm puis de -0.45 pour une porte et réciproque pour l'autre.

portes fermées à T=0
ScreenShot075.jpg
ScreenShot075.jpg (59.14 Kio) Consulté 3452 fois
Portes ouvertes en fonctionnement normal au début
ScreenShot076.jpg
ScreenShot076.jpg (78.93 Kio) Consulté 3452 fois
Le pb est qu'au fur et à mesure les portes ne se ferment plus complètement
Photo prise au bout de 5mn, les portes restent dans cette position , se déplacent (pour ouvrir l'entrée) mais ne ferment plus
ScreenShot077.jpg
ScreenShot077.jpg (107.2 Kio) Consulté 3452 fois
Les portes se referment lorsque qu'un deuxième personnage active le trigger mais eelles restent ouvertes.
Existe t'il une option sur les mvt faits dans Unity par l'onglet Animation pour remettre parfaitement à 0 les animations ?

Merci


Edit au bout de 15 mn le décalage est si important que les portes ont ouvertes au repos et quand le trigger est activé elles se referment

Re: Animation de portes glissantes qui se décalent

Publié : 03 Déc 2019 20:06
par Max
Bonsoir,

comment gères-tu tes animations ?
Qui dit Trigger dit script. Poste le, ça peut aider.

Re: Animation de portes glissantes qui se décalent

Publié : 03 Déc 2019 20:25
par freepl
Bonjour

Voici le script

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

/* Quand le cude est activé ( traversé par la camera ou bien par un personnage) cela lance l'ouverture et la fermeture
des portes de l'ascenceur
( sur 4 secondes pour le mvt complet)
porte_ascenceur_gauche     animation ouverturePortegauche
porte_ascenceur_droite     animation ouverturePortedroite

if trigger 

en js porte_ascenceur_droite.animation.Play("ouverturePortedroite").
GetComponent<Panneau>().vitesse = vitesseReprise;

GetComponent<porte_ascenceur_droite>().animation = ouverturePortedroite; ??
*/


public class DetectionPmrOuvertureFermetureAscenceur : MonoBehaviour {



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

	// Update is called once per frame
	void OuvertureAscenceur () {
		
	}

	// script qui detruit le vl à la fin du parcours 
	// mettre une box other sur les vl
	public IEnumerator OnTriggerEnter (Collider other) { 
		if (other.tag == "VEHICULE" || other.tag == "PIETON" || other.tag == "VELO" || other.tag == "PMR") // destruction du vl
		{
			//GameObject.Find ("porte_ascenceur_droite").GetComponent<animation>().ouverturePortedroite();
			//GameObject.Find ("porte_ascenceur_droite").GetComponent<animation>().ouverturePortegauche();
			GameObject.Find("porte_ascenceur_droit").GetComponent<Animator>().enabled=true;
			GameObject.Find("porte_ascenceur_gauche").GetComponent<Animator>().enabled=true;

			yield return new WaitForSeconds(4);

			GameObject.Find("porte_ascenceur_droit").GetComponent<Animator>().enabled=false;
			GameObject.Find("porte_ascenceur_gauche").GetComponent<Animator>().enabled=false;
				//GameObject.Find ("GestionCamera").GetComponent<GestionSelectionVl>().vl = null;
				//other.transform.FindChild("Camera   PRINCIPALE").SetParent(GameObject.Find ("GestionCamera").transform);
				
			}
			//Destroy(other.gameObject);
		}






}
Et le package ( il faut faire toucher plusieurs fois ( dès la 5° fois) le cube trigger pour voir le décalage.
PMR_Ouverture_Fermeture_Portes_Ascenceur.zip
(54.76 Kio) Téléchargé 103 fois

Re: Animation de portes glissantes qui se décalent

Publié : 03 Déc 2019 21:53
par Max
Re,

Il te faut vraiment appréhender le système d'animation actuel d'Unity. Déjà, sur tes portes tu as en même temps un component Animator et un component Animation. C'est l'un ou l'autre, plus particulièrement Animator (Animation étant déprécié, à éviter donc).

En suite, dans les deux Animators, tu dois avoir un état stable, avec par exemple un paramètre qui va permettre (via le script) de déclencher l'animation d'aller/retour de tes portes, genre:

Image

La transition (montante) pour l'ouverture de la porte va se déclencher grâce au trigger de l'Animator (paramètre OpenClose à gauche), et se terminer (transition descendante) une fois l'animation terminée.

Dans ton script, le Trigger de détection (là on parle du Boxcollider de ta scène) donnerait quelque chose comme celà (en gardant quelque peu ta notation d'origine):

Code : Tout sélectionner

    private Animator asc1;
    private Animator asc2;

    // Use this for initialization
    void Start () 
    {
        asc1 = GameObject.Find("porte_ascenceur_droit").GetComponent<Animator>();
        asc2 = GameObject.Find("porte_ascenceur_gauche").GetComponent<Animator>();
    }


	// script qui detruit le vl à la fin du parcours 
	// mettre une box other sur les vl
	public void OnTriggerEnter (Collider other) 
    {
        // attentd la fin de l'animation avant d'en déclancher une autre
        if( ! asc1.GetCurrentAnimatorStateInfo(0).IsName("OuverturePorteDroite"))
        {   // déclenche le trigger de l'animator de chaque porte
            asc1.SetTrigger("OpenClose");
            asc2.SetTrigger("OpenClose");
        }
    }

Re: Animation de portes glissantes qui se décalent

Publié : 03 Déc 2019 22:09
par freepl
Je dois donc faire 2 animations?
Ouverture
Fermeture

Re: Animation de portes glissantes qui se décalent

Publié : 04 Déc 2019 00:02
par Max
freepl a écrit :
03 Déc 2019 22:09
Je dois donc faire 2 animations?
Ouverture
Fermeture
Ben cela serait quand même mieux. Là tu as une animation qui est faite d'un seul tenant "ouverture/fermeture", que tu essais de couper au milieux tant bien que mal pour avoir une phase où les portes restent ouvertes. D'où au bout d'un moment ce décalage progressif car tu ne seras jamais pile-poil dans le même timing que tes anim.
L'idéal reste quand même d'avoir deux phases bien distinctes, avec une commande à l'ouverture, puis en suite une commende à la fermeture, chacune avec une animation dédiée.

D'ailleurs, c'est un très bon exercice ce genre de chose, si simple en apparence (ouvrir/fermer des portes), mais qui fait appel à pas mal de fonctionnalités d'unity, et dont la logique et la mise en œuvre n'est finalement pas si évident.

Re: Animation de portes glissantes qui se décalent

Publié : 04 Déc 2019 12:03
par freepl
Bonjour

J'ai fait 2 mouvements de fermeture ouverture pour chaque porte porte par Animation.
et 2 scripts.


L'actionneur touche le cube trigger et ouvre les 2 portes.
1 Les 2 portes s'ouvrent en décalé
2 Je ne sais pas comment laisser les portes ouvertes jusqu'à ce que l'actionneur touche le cube trigger de fermeture

Fermeture

Code : Tout sélectionner

using UnityEngine;
using System.Collections;
public class TestFermeture : MonoBehaviour {



	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	
	// Update is called once per frame
	void OuvertureAscenceur () {
		
	}
	
	// script qui detruit le vl à la fin du parcours 
	// mettre une box other sur les vl
	public IEnumerator OnTriggerEnter (Collider other) { 
		if ( other.tag == "PIETON" || other.tag == "PMR") 
		{

			GameObject.Find("Porte_vitree_droite").GetComponent<Animator>().enabled=false;
			GameObject.Find("Porte_vitree_gauche").GetComponent<Animator>().enabled=false;
			
			yield return new WaitForSeconds(1);
			


			
		}
	}







}

Ouverture

Code : Tout sélectionner

using UnityEngine;
using System.Collections;




public class TestOuverture : MonoBehaviour {



	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	
	// Update is called once per frame
	void OuvertureAscenceur () {
		
	}
	
	// script qui detruit le vl à la fin du parcours 
	// mettre une box other sur les vl
	public IEnumerator OnTriggerEnter (Collider other) { 
		if ( other.tag == "PIETON" || other.tag == "PMR") 
		{

			GameObject.Find("Porte_vitree_droite").GetComponent<Animator>().enabled=true;
			GameObject.Find("Porte_vitree_gauche").GetComponent<Animator>().enabled=true;
			
			yield return new WaitForSeconds(1);
			


			
		}
	}







}
merci

Re: Animation de portes glissantes qui se décalent

Publié : 04 Déc 2019 12:44
par Max
Bonjour,

Déjà, configure correctement tes AnimatorControllers. On va essayer de faire simple.
Ils doivent ressembler à ça:

Image

Pour les données de chaque state, voir comme ci-dessous:

Image

Pour les transitions, (idem pour la partie fermeture)

Image

Même chose pour le controller de la porte gauche.
Une fois que tu auras passé cette étape, on passera à la partie code.

Re: Animation de portes glissantes qui se décalent

Publié : 04 Déc 2019 13:25
par freepl
pour les données de state je suis sur unity 4.6

Re: Animation de portes glissantes qui se décalent

Publié : 04 Déc 2019 13:29
par freepl
les transitions

Dois-je toucher à transition duration et tout mettre à 0.1 ?
Et pour Exit time, c'est écrit 0.75 ou bien 0.9. J'y touche ?