Salut les Makers !
//@walk-e Team //vous pouvez utiliser et modifier ce code comme bon vous semble using UnityEngine; using System.Collections; using System.Collections.Generic; using System; public class ScriptMoteur : MonoBehaviour { public HingeJoint hingeJoint3D; GameObject mainServo; private JointMotor motor; [Tooltip("Angle of the target servo in degrees")] [Range(-180f, 180f)] public float targetServoAngle; private float anglerech; //angle que le moteur cherche à atteindre //boucle qui va s'exécuter au lancement de la simu juste une fois void Start() { anglerech = targetServoAngle; this.motor = hingeJoint3D.motor; //unity a déjà prévu d'ajouter des moteurs surs la jointure //donc hingeJoint3D.motor est un moteur que l'on va pouvoir controler this.motor.force = 50; //on peut changer la force du moteur this.motor.targetVelocity = 0; //on peut changer la vitesse de rotation this.motor.freeSpin = false; //pour le laisser en roue libre this.hingeJoint3D.motor = motor; // hingeJoint3D.motor = motor pour que hingeJoint3D.motor prenne bien les modifs de motors //j'oubliais ca au debut donc forcement ca marche pas trop this.hingeJoint3D.useMotor = true; //on lui dit qu'elle doit utiliser le moteur Debug.Log("ServoMoteurEnAction"); } //ici c'est une boucle qui tourne tout le long de le sium à chaque rafraîchissement de l'ecran void Update() { //on calcule la distance entre this.hingeJoint3D.angle (angle actuel) et l'angle cible float distance = Mathf.DeltaAngle(this.hingeJoint3D.angle, targetServoAngle); //en fonction de ca on déduit le sens de rotation if (distance < 0) { motorActiv(-1); } else { motorActiv(1); } this.hingeJoint3D.motor = motor; //on oublie pas à la fin de void Update() de bien utiliser hingeJoint3D.motor = motor; sinon les modifs appliqués a motor ne s'appliquent pas } //un setter si jamais on veut changer l'angle cible dans une classe externe public void setAngle(int pvanglerech) { this.anglerech = pvanglerech; } //fonction 'principale' private void motorActiv(int way) { this.motor.targetVelocity = 100 * way; this.motor.force = 100; UpdateRotationLimits(way); hingeJoint3D.useLimits = true; } //on change juste les limites pour stoper le moteur void UpdateRotationLimits(int direction) { var limits = new JointLimits(); if (direction == 1) { limits.max = targetServoAngle; limits.min = 0; } if (direction == -1) { limits.min = targetServoAngle; limits.max = 0; } hingeJoint3D.limits = limits; } //ce qui suit fut trouvé sur internet (Open Source bien sur) ------------------------- float AngleFromAngle1ToAngle2Degrees(float angle1, float angle2) { angle1 = WrapAngleDegrees(angle1); angle2 = WrapAngleDegrees(angle2); if (angle2 - angle1 < 180 && angle2 > angle1) { return angle2 - angle1; } else if (angle2 - angle1 > 180 && angle2 > angle1) { return -(360 - (angle2 - angle1)); } else if (angle1 - angle2 < 180 && angle1 > angle2) { return -(angle1 - angle2); } else if (angle1 - angle2 > 180 && angle1 > angle2) { return 360 - (angle1 - angle2); } else if (angle1 - angle2 == 180) { return 180; } else if (angle2 - angle1 == 180) { return 180; } return 0; } // Convenience function to keep the angles in range from -360 to 360 static float WrapAngleDegrees(float angle) { angle = (float)Math.IEEERemainder(angle, 360); if (angle <= 0) { angle += 360; } else { if (angle > 360) { angle -= 360; } } return angle; } }
