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














