Bloquer après rotation un hinge joint sur une des limites

Questions à propos du scripting. Hors Shader, GUI, Audio et Mobile.
twix
Messages : 5
Inscription : 27 Déc 2018 23:16

Bloquer après rotation un hinge joint sur une des limites

Message par twix » 25 Fév 2019 08:53

Bonjour,

J'essaie de produire la chose suivante :

Comme vous pouvez le voir dans l'image jointe, j'ai une sorte de catapulte.
L'animation se jouera sur mobile.
Le fait de taper sur l'écran revient à exercer une force verticale sur la partie de droite.
La catapulte bascule donc.

Mais, je souhaite que si je garde mon doigt sur l'écran, la catapulte reste basculée et ce n'est que lorsque j'enlève mon doigt qu'elle revient dans sa position initiale.

Voici ce que j'ai fait:

- la catapulte est constituée d'un seule sprite
- Rigidbody 2D
- Hinge Joint placé au niveau de la boule qui permet la bascule
- je défini des "Angles limites" sur le Hinge Joint (lower 24 / upper 1)
- j'active le motor pour avoir un retour automatique : speed = -1000 / max force = 100

Dans mon code j'utilise addTorque()
ça fonctionne presque : la rotation est bien appliquée et la catapulte se limite bien dans son mouvement
Lorsque je relâche l'écran, le motor remet la catapulte dans sa position initiale.

Pour maintenir la catapulte basculée, je teste la phase de touch et si on est sur "Stationary", je continue à envoyer un addTorque()

Malheureusement, sur un mobile, avec le framerate, on voit la catapulte trembler légèrement lors du maintien.

Ma question est donc :
Comment faire en sorte de bloquer dans sa position "basculée" ma catapulte ?
Est-ce que je dois utiliser un freezeRotation sur le Rigidbody pendant la phase Touch.Stationary ou un trick de ce genre ?

Merci par avance de votre aide

Image

Code : Tout sélectionner


public float torqueSpeed = 1000f;
private Rigidbody2D rb2D;

// Start()
rb2D = GetComponent<Rigidbody2D>();

// FixedUpdate()
Touch touch = Input.GetTouch(0);

switch (touch.phase) {
    case TouchPhase.Began:
        rb2D.AddTorque(-torqueSpeed);
    break;

    case TouchPhase.Stationary:
        rb2D.AddTorque(-torqueSpeed);
    break;
}


twix
Messages : 5
Inscription : 27 Déc 2018 23:16

Re: Bloquer après rotation un hinge joint sur une des limites

Message par twix » 25 Fév 2019 10:03

J'ai tenté une autre approche, plutôt que d'utiliser addTorque(), j'ai uniquement agit sur le motor en faisant varier sa vitesse.

ça fonctionne presque car il arrive que la catapulte reste coincé alors que je n'appui plus sur l'écran.

Des idées ?

Code : Tout sélectionner


private HingeJoint2D hingeJoint2D;
private JointMotor2D jointMotor2D;


// start()
    hingeJoint2D = GetComponent<HingeJoint2D>();
    jointMotor2D = hingeJoint2D.motor;
    
// FixedUpdate()
switch (touch.phase) {
    case TouchPhase.Began:
        jointMotor2D.motorSpeed = 1000f;
        hingeJoint2D.motor = jointMotor2D;
    break;

    case TouchPhase.Ended:
        jointMotor2D.motorSpeed = -1000f;
        hingeJoint2D.motor = jointMotor2D;
    break;
}
            
Dernière édition par twix le 25 Fév 2019 10:12, édité 1 fois.

twix
Messages : 5
Inscription : 27 Déc 2018 23:16

Re: Bloquer après rotation un hinge joint sur une des limites

Message par twix » 25 Fév 2019 10:11

ça avance ...

Si mon code est dans Update(), je n'ai plus l'anomalie

Je l'avais mis dans FixedUpdate() initialement

Reste à voir si j'arrive à jouer sur une variation de la force en fonction du temps de tap .... en gros, un tap rapide, bascule partiellement et le projectile part moins loin qu'avec un tap prolongé.

Est-ce que mon approche est bonne ?

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

Re: Bloquer après rotation un hinge joint sur une des limites

Message par Max » 25 Fév 2019 10:24

Hello,

Tu peux essayer avec les Constraints.

Pas bouger:

Code : Tout sélectionner

rb.constraints = RigidbodyConstraints2D.FreezeAll;
libre:

Code : Tout sélectionner

rb.constraints = RigidbodyConstraints2D.None;
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

twix
Messages : 5
Inscription : 27 Déc 2018 23:16

Re: Bloquer après rotation un hinge joint sur une des limites

Message par twix » 25 Fév 2019 23:41

Max a écrit :
25 Fév 2019 10:24
Tu peux essayer avec les Constraints.
Merci pour ta réponse.
J'ai finalement opté pour l'utilisation du Motor au lieu du Torque qui permet de passer d'une limite à l'autre juste en inversant sa vitesse.

Répondre

Revenir vers « Scripting »