Personnage monte escalier mais sur path et doncmvt en dent de scie

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: Personnage monte escalier mais sur path et doncmvt en dent de scie

Message par freepl » 14 Nov 2019 20:01

Merci

Cela fonctionne nickel.
Comme mes véhicules sont taggués en VEHICULE et les piétons en PIETONS, j'ai utilisé les tags pour différencier le comportement de mes objets : si véhicules, on suit le path
si piétons on reste droit

Code final

Code : Tout sélectionner

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;

/* modif pour vehicule ou personnage*/
			
			
			if (gameObject.tag == "VEHICULE")
			{
				transform.LookAt(iTween.PointOnPath(tabtList, fraction + 0.1f));
			}
			else 
			{
				Vector3 direction =iTween.PointOnPath(tabtList, fraction + 0.1f);
				direction.y = this.transform.position.y;
				transform.LookAt(direction);
			}





			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;
		}
	}

}

Mes véhicules ont un comportement normal, mes perso aussi.
Je n'ai plus rien à modifier sur ma maquette.

Un très grand merci à toi.

Je ne mets pas en RESOLU si tu veux ajouter quelque chose.

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6186
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Personnage monte escalier mais sur path et doncmvt en dent de scie

Message par boubouk50 » 14 Nov 2019 20:12

Je n'ai rien à ajouter.
Il est clair que niveau conception, il y a énormément à faire, mais bon il faut des bases solides en dev pour en arriver là.
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Répondre

Revenir vers « Scripting »