[Résolu] [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Pour les scripts écrits en C#
Règles du forum
Merci de respecter la NOMENCLATURE suivante pour vos TITRES de messages :

Commencez par le niveau de vos scripts
DB = Débutant
MY = Moyen
CF = Confirmé

Puis le domaine d'application
-RS = Réseau
-AL = Algorithmie

Exemple :

[DB-RS] Mouvement perso multijoueur
Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

[Résolu] [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par freepl » 12 Déc 2019 12:24

Bonjour

J'ai ce script de fermeture/ouverture de porte.
Il fonctionne sans pb pour un perso qui passe tranquillement.
Dans mon projet, il y a 2 path qui passent par cette "porte". Les perso qui prennent ces paths sont gérés aléatoirement.
Du coup il arrive que 2 perso passent en même temps l'un des 2 détecteurs, et il arrive que la porte reste ouverte.
Par exempl 2 perso passent en même temps le trigger d'entrée mais un perso va plus vite et passe le trigger de sortie.
La porte se ferme donc.
Puis le dauxième perso passe aussi le triger de sortie, mais du coup , il ouvre la porte qui reste donc ouverte.

Pour palier à cela j'ai modifier le script pour qu'au bout d'une seconde la porte se ferme.
Mais j'ai ce code erreur

Code : Tout sélectionner

Assets/PMR ascenseur et baie vitree/PMR_Ascenceur Baie Vitree/Baie vitree 2fbx/OuverturefermeturePorte.cs(43,17): error CS1014: A get or set accessor expected
le code

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class OuverturefermeturePorte : MonoBehaviour 
{
	// à renseigner dans l'inspector
	[SerializeField] Animator porteDroite;
	[SerializeField] Animator porteGauche;
	
	static private bool opendoor = false;
	
	/// <summary>
	/// OnTriggerEnter
	/// </summary>
	/// <param name="other"></param>
	public void OnTriggerEnter (Collider other) 
	{ 
		if ( other.tag == "PIETON" || other.tag == "Player") 
		{
			// déclenche le trigger de l'animator de chaque porte
			if(!opendoor)
			{   // si portes fermées, alors on ouvre
				porteDroite.SetBool("Ouverture", true);
				porteGauche.SetBool("Ouverture", true);
				opendoor = true;
			}
			else
			{   // sinon portes ouvertes, donc on ferme
				porteDroite.SetBool("Ouverture", false);
				porteGauche.SetBool("Ouverture", false);
				opendoor = false;
			}
		}




	}
	 
	public IEnumerator FermetureSiOuverture {  
		
		// si 2 perso passent vite possibilité de pb de fermeture donc tempo de fermeture
		yield return new WaitForSeconds(1); // attente 1sec puis fermeture forcée
		if(opendoor)
		{   // si portes encore ouvertes, alors on ferme
			porteDroite.SetBool("Ouverture", false);
			porteGauche.SetBool("Ouverture", false);
			opendoor = false;
		}
		
	}




Merci
Dernière édition par freepl le 12 Déc 2019 15:47, édité 1 fois.

Avatar de l’utilisateur
Max
Messages : 8772
Inscription : 30 Juil 2011 13:57
Contact :

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par Max » 12 Déc 2019 12:29

Re,

remplace

Code : Tout sélectionner

public IEnumerator FermetureSiOuverture {
par

Code : Tout sélectionner

public IEnumerator FermetureSiOuverture() {
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

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

Re: [MY-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par boubouk50 » 12 Déc 2019 12:34

Salut,

ça vient de la conception même du système qui est alambiquée. Tu ne te sers que de OnTriggerEnter, alors qu'il existe OnTriggerStay et OnTriggerExit... M'enfin, Unity te donne des outils faits exprès pour, fonctionnels et faciles à utiliser et tu trouves le moyen de sortir un algo tordu avec.

Tu fais un gros trigger autour de ta porte:
OnEnter -> Ouvre
OnStay -> Ne peux pas fermer
OnExit -> Ferme

Ca prend 2 minutes et c'est fonctionnel pour tous les cas.
"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

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par freepl » 12 Déc 2019 12:41

Merci

Si je touche le trigger d'entrée et attends 1 sec la porte reste toujours ouverte.
Edit
Désolé boubouk50, j'ai écrit sans voir ton msg.
Le script fonctionne parfaitement mais c'est quand 2 persos passent en même temps que vient le bug.
C'est le contraire de onStay qu'il me faut en fait

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

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par boubouk50 » 12 Déc 2019 13:01

Si tu ne veux pas de mon aide... je vais pas me forcer. Ce que je t'ai donné est la solution. Si tu veux t'entêter à rester sur ton code et ton raisonnement scabreux, tu es libre.

L'inverse de OnStay, ça ne veut rien dire, ça voudrait dire que pour chaque élément qui n'est pas dedans, alors tu fais quelque chose. Sauf, que ça sera eefectif pour TOUS les colliders de ta scène. Ce qui est aberrant.
OnStay te permet de savoir si quelqu'un est dedans, et c'est exactement ce que tu veux.
"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

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par freepl » 12 Déc 2019 13:38

Je n'avais pas compris le rôle de OnStay.
Voici mon code modifié sur un seul trigger.

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PresencePerso : MonoBehaviour 
{
	// à renseigner dans l'inspector
	[SerializeField] Animator porteDroite;
	[SerializeField] Animator porteGauche;
	
	static private bool opendoor = false;
	
	/// <summary>
	/// OnTriggerEnter
	/// </summary>
	/// <param name="other"></param>
	public void OnTriggerEnter (Collider other) 
	{ 

			// déclenche le trigger de l'animator de chaque porte
			if(!opendoor)
			{   // si portes fermées, alors on ouvre
				porteDroite.SetBool("Ouverture", true);
				porteGauche.SetBool("Ouverture", true);
				opendoor = true;
			}

		}

 
	public void OnTriggerExit (Collider other) 
	{ 
		if ( other.tag == "PIETON" || other.tag == "Player") 


			{   //  portes ouvertes, donc on ferme
				porteDroite.SetBool("Ouverture", false);
				porteGauche.SetBool("Ouverture", false);
				opendoor = false;
			}
		
		
	}


	public void OnTriggerOnStay (Collider other) 
	{ 
		if ( other.tag == "PIETON" || other.tag == "Player") // 2 perso passent en meme temps, si perso dans le sas on ferme
			
			
		{   //  portes ouvertes, donc on ferme
			porteDroite.SetBool("Ouverture", false);
			porteGauche.SetBool("Ouverture", false);
			opendoor = false;
		}
		
		
	}

}
Image 0 , 2 actionneurs à l'extérieur
Z131.jpg
Z131.jpg (49.71 Kio) Consulté 3614 fois
Image1, 1 actionneurs est dans la zone, les portes s'ouvrent
Z133.jpg
Z133.jpg (39.39 Kio) Consulté 3614 fois
Pièces jointes
Z134.jpg
Z134.jpg (35.64 Kio) Consulté 3614 fois

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par freepl » 12 Déc 2019 13:40

la suite

image 3 , un actionneur sort de la zone, les portes se ferment alors qu'il y a toujours le deuxième actionneur présent dans la zone
Z135.jpg
Z135.jpg (46.8 Kio) Consulté 3613 fois

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

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par boubouk50 » 12 Déc 2019 14:10

Tu as juste copier-coller le OnTriggerExit () dans OntriggerStay ()...

C'est pas le comportement que je t'ai suggéré:
OnEnter: On ouvre (si pas ouvert)
OnStay: On empêche la fermeture
OnExit: On ferme (si fermeture pas empêchée)

Mieux:
quand tu entres, tu incrémentes un compteur de présence. Tu ouvres si tu es le seul -> Compteur à 0 avant incrément.
quand tu sors, tu décrémentes ce compteur de présence. Tu fermes si tu es le seul -> Compteur à 0 après décrément.

Même plus besoin du OnTriggerStay ().
"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

Avatar de l’utilisateur
freepl
Messages : 1034
Inscription : 20 Mai 2012 19:33
Localisation : salon de provence

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par freepl » 12 Déc 2019 14:40

J'ai du mal avec le fonctionnement. Je ne vois pas quel nombre mettre pour la fermeture .
voici le code. Les portes se ferment avec un actionneur dans la zone et l'autre sorti

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PresencePerso : MonoBehaviour 
{
	// à renseigner dans l'inspector
	[SerializeField] Animator porteDroite;
	[SerializeField] Animator porteGauche;
	int Presence = 0; // valeur de présence de perso à incrémenter de 0 à 1  +1 avec entre, -1 avec Exit
	static private bool opendoor = false;
	
	/// <summary>
	/// OnTriggerEnter
	/// </summary>
	/// <param name="other"></param>
	public void OnTriggerEnter (Collider other) 
	{ 

			// déclenche le trigger de l'animator de chaque porte
			if(!opendoor)
			{   // si portes fermées, alors on ouvre
				porteDroite.SetBool("Ouverture", true);
				porteGauche.SetBool("Ouverture", true);
				opendoor = true;
			Presence++;
			}

		}

 
	public void OnTriggerExit (Collider other) 
	{ 
		if ( other.tag == "PIETON" || other.tag == "Player") 


			{   //  portes ouvertes, donc on ferme
				porteDroite.SetBool("Ouverture", false);
				porteGauche.SetBool("Ouverture", false);
				opendoor = false;
			Presence--;
			}
	}


	public void VerificationPresence () 
	{ 
		if ( Presence>=1) // si 1 ou 2 perso  dans le sas on ouvre
		{   
			porteDroite.SetBool("Ouverture", true);
			porteGauche.SetBool("Ouverture", true);
			opendoor = true;
		}
		if ( Presence==0) // si pas de  perso  dans le sas on ferme
		{   
			porteDroite.SetBool("Ouverture", false);
			porteGauche.SetBool("Ouverture", false);
			opendoor = false;
		}
		
	}










}


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

Re: [DB-AL] Script de fermeture/ouverture de porte avec tempo de sécurité

Message par boubouk50 » 12 Déc 2019 14:52

Pourquoi tu t'obstines continuellement à ne pas suivre ce que je te suggère. :roll:
Comment fais-tu avec 3 personnes? 4? 154513134?

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PresencePerso : MonoBehaviour 
{
	// à renseigner dans l'inspector
	[SerializeField] Animator porteDroite;
	[SerializeField] Animator porteGauche;
	private int compteurPresence = 0;
	
	public void OnTriggerEnter (Collider other) 
	{
		//GESTION SEULEMENT POUR LES PIETONS OU JOUEUR
		if (other.tag == "PIETON" || other.tag == "Player")
		{
			//Y'A-T-IL QUELQU'UN? SI PERSONNE ON OUVRE SINON LES PORTES SONT DEJA OUVERTES
			if (compteurPresence == 0)
			{
				porteDroite.SetBool("Ouverture", true);
				porteGauche.SetBool("Ouverture", true);
			}
			//INCREMENTATION DU COMPTEUR
			compteurPresence++;
		}
	}
 
	public void OnTriggerExit (Collider other) 
	{
		//GESTION SEULEMENT POUR LES PIETONS OU JOUEUR
		if ( other.tag == "PIETON" || other.tag == "Player")
		{
			//DECREMENTATION DU COMPTEUR
			compteurPresence--;
			//Y'A-T-IL QUELQU'UN? SI PERSONNE ON FERME SINON ON LAISSE LES PORTES OUVERTES
			if (compteurPresence == 0)
			{
				porteDroite.SetBool("Ouverture", false);
				porteGauche.SetBool("Ouverture", false);
			}
		}
	}
}
Voici un algo que je n'ai pas testé, mais qui fait exactement ce que j'ai suggéré. Rien de plus, rien de moins, rien de superflu ou d'inutile. Simple.
Cette manie de compliquer des choses pourtant simples, inutilement, ça relève du masochisme. :hehe:
"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 « (C#) CSharp »