J'ai découvert le logiciel Unity il y a 2 mois de cela, mais je pratique la programmation objet depuis 3 ans, et mon souçi est plutôt technique (code pur).
J'ai programmé un script permettant d'ouvrir des portes battantes (avec une rotation de l'angle). Ce script dépend d'un autre script, permettant la détection du player vers la zone de porte avec une méthode OnTriggerEnter().
Voici mon problème : J'ai deux variables, permettant de définir un angle (private int angle;) d'ouverture et de fermeture (plutôt un nombre de pas d'ouverture et de fermeture) et une autre variable permettant de récupérer l'angle à chaque frame (private int currentAngle;). Une fois que le player a passé le script DoorsDetection.cs, et qu'il rencontre le Trigger collé à la poignée de la porte, le script DoorsRotation se lance.
Tant que this.currentAngle < this.angle est vérifiée, currentAngle s'incrémente. Si cette dernière n'est plus vérifiée, alors l'ouverture passe à False et la fermeture passe à True.
Une fois qu'on sort du bloc this.Openning, mes deux variables passent à 0 sans explications, et on rentre donc dans le bloc this.Closing avec des variables dont la valeur est 0 (testé en mode debug avec des espions).
Après des heures de recherche et de test sans succès, je me réfère donc à vous.
Voici le code de mon script DoorsRotation.cs.
Merci d'avance pour votre aide !
Code : Tout sélectionner
using System.Collections;
using UnityEngine;
public class DoorsRotation : MonoBehaviour
{
#region Declaration Variables
[SerializeField]
private int currentAngle;
// Angle d'ouverture de la porte
[SerializeField]
private int angle;
[SerializeField]
private static float timer;
[SerializeField]
private BoxCollider triggerInfo;
[SerializeField]
private CapsuleCollider triggerPoignee;
// Composants du vive
[SerializeField]
private SteamVR_TrackedObject trackedObj;
// Récupère l'entrée du vive
[SerializeField]
private SteamVR_Controller.Device inputVive
{
get
{
return SteamVR_Controller.Input((int)this.trackedObj.index);
}
}
[SerializeField]
private DoorsDetection doorsDetection;
#endregion
#if UNITY_EDITOR
#region Show Statics Variables for test
public float staticTimer;
#endregion
#endif
/// <summary>
/// Passage de la variable <seealso cref="DoorsDetection.Openning"/> a true, permettant l'ouverture de la porte
/// Si <seealso cref="doorsDetection.ViveConnected"/> vaut true, on vérifie que le player presse le bouton du vive (ID 14 || ID 15) avant d'ouvrir la porte
/// </summary>
/// <param name="collider"></param>
private void OnTriggerEnter(Collider collider)
{
this.currentAngle = 0;
// Ajustement de l'angle en fonction de certaines portes
switch(DoorsDetection.Door.parent.name)
{
case "Door_Middle_Left_6":
this.angle = 150;
break;
case "Door_Middle_Left_7":
case "Door_Middle_Left_8":
this.angle = 140;
break;
case "Door_Office_Left_1":
case "Door_Office_Left_2":
case "Door_Office_Left_3":
case "Door_Center_1":
this.angle = 60;
break;
case "Door_Middle_Left_9":
case "Door_Middle_Left_10":
this.angle = 130;
break;
default:
this.angle = 180;
break;
}
// Get DoorsDetection Data
this.doorsDetection = DoorsDetection.Door.Find("ZoneDoorsMsg").GetComponent<DoorsDetection>();
// Si le vive est connecté, on doit presser le bouton Trigger du vive pour ouvrir la porte
if (this.doorsDetection.ViveConnected)
{
this.trackedObj = GetComponent<SteamVR_TrackedObject>();
if(this.inputVive.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
{
DoorsDetection.Openning = true;
timer = 20;
this.triggerInfo = DoorsDetection.Door.Find("ZoneDoorsMsg").GetComponent<BoxCollider>();
this.triggerPoignee = DoorsDetection.Door.Find("TriggerDoors").GetComponent<CapsuleCollider>();
StartCoroutine(this.disabledTriggerForTime());
this.triggerPoignee.isTrigger = false;
}
}
else
{
DoorsDetection.Openning = true;
timer = 20;
this.triggerInfo = DoorsDetection.Door.Find("ZoneDoorsMsg").GetComponent<BoxCollider>();
this.triggerPoignee = DoorsDetection.Door.Find("TriggerDoors").GetComponent<CapsuleCollider>();
StartCoroutine(this.disabledTriggerForTime());
this.triggerPoignee.isTrigger = false;
}
}
/// <summary>
/// Permet de lancer la méthode <see cref="OpenDoor(bool)"/> et <see cref="CloseDoor(bool)"/>, respectivement en fonction de la valeur des variables <see cref="DoorsDetection.Openning"/>
/// && <see cref="DoorsDetection.Closing"/>
/// </summary>
private void FixedUpdate()
{
#if UNITY_EDITOR
// Show variables statics for test
this.staticTimer = timer;
#endif
if (DoorsDetection.Openning)
{
if (this.currentAngle < this.angle)
{
this.currentAngle += 1;
this.OpenDoor(DoorsDetection.CoteAngle);
}
else
{
Debug.Log(timer);
timer -= Time.deltaTime;
if(timer <= 0)
{
DoorsDetection.Openning = false;
DoorsDetection.Closing = true;
}
}
}
// MES VARIABLES REPASSENT A 0
if(DoorsDetection.Closing)
{
Debug.Log(this.currentAngle);
Debug.Log(this.angle);
Debug.Log("jhdjkfdhszkjfhdskj");
if (this.currentAngle > 0)
{
this.currentAngle -= 1;
this.CloseDoor(DoorsDetection.CoteAngle);
}
else
{
DoorsDetection.Closing = false;
DoorsDetection.Door.rotation = DoorsDetection.RotationBase;
this.triggerPoignee = DoorsDetection.Door.Find("TriggerDoors").GetComponent<CapsuleCollider>();
this.triggerPoignee.isTrigger = true;
this.doorsDetection = null;
}
}
}
/// <summary>
/// Ouverture de la porte, avec détermination du côté d'ouverture avec le paramètre <paramref name="cote"/>
/// </summary>
/// <param name="cote"></param>
private void OpenDoor(bool cote)
{
DoorsDetection.Door.transform.RotateAround(DoorsDetection.Pivot.position, cote ? Vector3.down : Vector3.up, this.currentAngle * Time.deltaTime * 1.5F);
}
/// <summary>
/// Fermeture de la porte, avec détermination du côté d'ouverture avec le paramètre <paramref name="cote"/>
/// </summary>
/// <param name="cote"></param>
private void CloseDoor(bool cote)
{
DoorsDetection.Door.transform.RotateAround(DoorsDetection.Pivot.position, cote ? Vector3.up : Vector3.down, this.currentAngle * Time.deltaTime * 1.5F);
}
/// <summary>
/// Coroutine permettant de désactiver le Trigger de détection pendant 5 secondes
/// </summary>
/// <returns></returns>
private IEnumerator disabledTriggerForTime()
{
Debug.Log("Déclenchement de la coroutine pour désactiver le trigger" + this.triggerInfo.name + " message");
this.triggerInfo.enabled = false;
this.triggerInfo.isTrigger = false;
yield return new WaitForSeconds(5F);
this.triggerInfo.enabled = true;
this.triggerInfo.isTrigger = true;
yield return 0;
}
}