Partage
  • Partager sur Facebook
  • Partager sur Twitter

Unity 3D : Itween aligner verticalement un perso

    12 novembre 2019 à 11:42:27

    Bonjour

    J'utilise en script de déplacement basé sur ItWeen.

    Le pb vient que si le path de déplacement monte, le perso est toujours perpendiculaire à ce dernier. Il ne reste pas vertical. Je voudrais aligner le vecteur vertical du perso sur le vecteur vertical du monde 

    La ligne en question est celle-ci

    transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.1f));



    Mais je ne sais pas comment dire de rester vertical (  rotation sur l'axe vertical égale à 0)

    using UnityEngine;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    // la fonction de trajet aérien est bloquée
    /* Create by :
     * Fabian Métayer
     * 27/10/2015
     */
    public class TrajetVl : MonoBehaviour {
    	public GameObject target_Path;
    	public float kmh; // vitesse voulue
    	public float kmhActuel; // vitesse reelle
    	public float mEntrePoint = 5.0f;
    	private float time;
    	public float fraction;
    	public Transform[] tabtList = new Transform[11];
    	public int minTab = 0;
    	public Transform detecteur;
    	public LayerMask layerPanneau;
    	public Collider[] toucheDetecteur;
    	public bool coupeDetecteur;
    	private Light jourNuit;
    	private GameObject eclairage;
    	private GameObject eclairageFreins;
    	public GameObject clignotantsDroits;
    	public GameObject clignotantsGauche;
    	private IEnumerator coroutineClignotants;
    
    	public InterieurVl interieur;
    
    	public void DemrageVl () {
    		tabtList = new Transform[11];
    		TabDynamique ();
    		if (transform.FindChild("Detecteur"))
    			detecteur = transform.FindChild("Detecteur").transform;
    
    		jourNuit = GameObject.Find("Sky Dome").transform.FindChild("Light").GetComponent<Light>();
    
    		//cherche dans ces enfants un object avec le nom Eclairage
    		//si existe alors on ajoute l'object portant le nom "Eclairage" dans la variable eclairage
    		if (this.transform.FindChild ("Eclairage")) {
    			eclairage = this.transform.FindChild ("Eclairage").gameObject;
    		}
    
    		if (this.transform.FindChild ("Eclairage_Freins")) {
    			eclairageFreins = this.transform.FindChild ("Eclairage_Freins").gameObject;
    			eclairageFreins.SetActive (false);
    		}
    		
    		if (this.transform.FindChild ("Eclairage_Clignotants_droits")) {
    			clignotantsDroits = this.transform.FindChild ("Eclairage_Clignotants_droits").gameObject;
    			clignotantsDroits.SetActive (false);
    		}
    
    		if (this.transform.FindChild ("Eclairage_Clignotants_gauche")) {
    			clignotantsGauche = this.transform.FindChild ("Eclairage_Clignotants_gauche").gameObject;
    			clignotantsGauche.SetActive (false);
    		}
    
    		StartCoroutine("WalkThePath");
    	}
    
    	public void TabDynamique () {
    		fraction = 0.1f;
    		int count = 0;
    
    		for (int i = 0; i < 11; i++) {
    			if (minTab+i < target_Path.transform.childCount) {
    				tabtList[i] = target_Path.transform.GetChild(minTab+i);
    				count++;
    			}
    		}
    
    		if (minTab+8 < target_Path.transform.childCount)
    			minTab += 8;
    		else
    			minTab += count;
    	}
    
    	public void StopCoroutine () {
    		StopCoroutine("WalkThePath");
    	}
    
    	IEnumerator WalkThePath () {
    		while(true){
    			time = (tabtList.Length * mEntrePoint)/(kmhActuel / 3.6f);
    			transform.position = iTween.PointOnPath (tabtList, fraction);
    			fraction += Time.deltaTime / time;
    			if (fraction > 1.0f)
    				fraction = 0.0f;
    			transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.1f));
    			if (kmhActuel < kmh){
    				kmhActuel += 0.7f;// acceleration jusqu'à la vitesse kmh 0.7f
    			} else if (kmhActuel > kmh && kmh != 0) {
    				kmhActuel -= 0.9f;// decceleration douce 0.9
    			} else if (kmh == 0) {
    				kmhActuel = 0;// on stoppe brutalement le VL
    			}
    
    			if (fraction >= 0.9f) //0.9f
    				TabDynamique();
    
    			GestionDetecteur ();
    			GestionLumiere ();
    			GestionFreins ();
    
    			yield return null;
    		}
    	}
    
    	void GestionDetecteur () {
    		if (detecteur != null) {
    			if (gameObject.tag == "VEHICULE")
    				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.75f, layerPanneau);
    			else
    				toucheDetecteur = Physics.OverlapSphere(detecteur.position, 0.5f, layerPanneau);
    
    			if (toucheDetecteur.Length != 0) {
    				foreach (var other in toucheDetecteur) {
    					if (other.tag == "CoupeDetecteur") {
    						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
    						kmhActuel = 50.0f;// pour degager les croisements
    					}
    
    					if (other.tag == "CoupeDetecteurAutre") {
    						coupeDetecteur = other.GetComponent<CoupeDetecteur>().detecteur;
    						kmhActuel = 4.0f;
    					}
    
    					if (coupeDetecteur == false) {
    						if (other.tag == "ModifVitesse") {
    							kmh = other.GetComponent<Panneau>().vitesse;
    						} else if (other.tag == "EntreeInstersection") {
    							kmh = other.GetComponent<Priorite>().vitesse;
    						} else if (other.tag == "VEHICULE") {
    
    							if (kmh > other.GetComponent<TrajetVl>().kmh)
    							kmh = other.GetComponent<TrajetVl>().kmh;
    						} else if (other.tag == "ClignotantsOn") {
    							kmh = other.GetComponent<GestionClignotants>().vitesse;
    							if (other.GetComponent<GestionClignotants>().trajet == target_Path) {
    								ClignotantsOff ();
    								if (other.GetComponent<GestionClignotants>().enumClignotants == EnumClignotants.Droites) {
    									coroutineClignotants = ClignotantsDroits();
    									StartCoroutine (coroutineClignotants);
    								} else {
    									coroutineClignotants = ClignotantsGauche();
    									StartCoroutine (coroutineClignotants);
    								}
    							}
    						} else if (other.tag == "ClignotantsOff") {
    							kmh = other.GetComponent<GestionClignotants>().vitesse;
    							ClignotantsOff ();
    						}
    					}
    				}
    			}
    
    			if (kmhActuel == 0 && toucheDetecteur.Length == 0)
    				kmhActuel = 30.0f;
    
    		}
    	}
    
    	void GestionLumiere () {
    		if (eclairage != null) {
    			if (jourNuit.intensity < 0.15f) {
    				if (eclairage.activeInHierarchy == false)
    					eclairage.SetActive (true);
    			}
    			else {
    				if (eclairage.activeInHierarchy == true)
    					eclairage.SetActive (false);
    			}
    		}
    	}
    
    	void GestionFreins () {
    		if (eclairageFreins != null){
    			if (kmhActuel > kmh+3 || kmhActuel == 0) {
    				if (eclairageFreins.activeInHierarchy == false)
    					eclairageFreins.SetActive (true);
    			} else {
    				if (eclairageFreins.activeInHierarchy == true)
    					eclairageFreins.SetActive (false);
    			}
    		}
    	}
    
    	IEnumerator ClignotantsDroits () {
    		if (clignotantsDroits != null) {
    			while (true) {
    				clignotantsDroits.SetActive (true);
    				yield return new WaitForSeconds (0.3f);
    				clignotantsDroits.SetActive (false);
    				yield return new WaitForSeconds (0.3f);
    			}
    		}
    	}
    
    	IEnumerator ClignotantsGauche () {
    		if (clignotantsGauche != null) {
    			while (true) {
    				clignotantsGauche.SetActive (true);
    				yield return new WaitForSeconds (0.3f);
    				clignotantsGauche.SetActive (false);
    				yield return new WaitForSeconds (0.3f);
    			}
    		}
    	}
    
    	void ClignotantsOff () {
    		if (coroutineClignotants != null) {
    			StopCoroutine (coroutineClignotants);
    
    			if (clignotantsDroits != null)
    				clignotantsDroits.SetActive (false);
    			if (clignotantsGauche != null)
    				clignotantsGauche.SetActive (false);
    			 
    			coroutineClignotants = null;
    		}
    	}
    
    }



    -
    Edité par freepl 12 novembre 2019 à 11:45:35

    • Partager sur Facebook
    • Partager sur Twitter

    Unity 3D : Itween aligner verticalement un perso

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown