Comment forcer un objet à rester sur sa position

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
Alesk
Messages : 2303
Inscription : 13 Mars 2012 09:09
Localisation : Bordeaux - France
Contact :

Re: Comment forcer un objet à rester sur sa position

Message par Alesk » 17 Mars 2015 22:03

dejam0rt a écrit : Pour conclure, j'insiste : Unity, aussi puissant soit-il, ne propose pas cette option, bien qu'elle soit on ne peut plus basique, au moins dans le concept. Et je trouve ça dingue :)
... ou alors tu regardes du coté de la fonction AddForce() pour voir comment faire correctement se mouvoir un objet en utilisant le moteur physique :roll:

Avatar de l’utilisateur
NDrew
Messages : 581
Inscription : 25 Oct 2013 15:14
Localisation : Clermont-Ferrand

Re: Comment forcer un objet à rester sur sa position

Message par NDrew » 17 Mars 2015 22:09

J'aime bien ces nouveau arrivant plein de certitude, c'est drole d'être jeune et naif... profitez bien de votre jeunesse avant de devenir des vieux cons comme nous :)

Et sinon tu n'as jamais répondu quand ils t'ont proposé les contraite sur ton rigidbody. Les blocage en Y bloquent meme la gravité, ca c'est fort!

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: Comment forcer un objet à rester sur sa position

Message par LudlowFx » 17 Mars 2015 22:13

dejam0rt a écrit :(en passant je me demande bien à quoi peux servir la case "static" dans la section transforme, si cela n'a pas la priorité sur la physique...)
http://docs.unity3d.com/Manual/StaticObjects.html (Le manuel est là pour une bonne raison)

@NDrew : + 1 pour les contraintes.
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Avatar de l’utilisateur
manthoR
Messages : 180
Inscription : 15 Mai 2014 11:43
Localisation : Paris, France
Contact :

Re: Comment forcer un objet à rester sur sa position

Message par manthoR » 17 Mars 2015 22:37

Je comprends vraiment pas pourquoi tu peux pas mettre un rigidbody sur ton paddle.

Pour faire simple (j'espère :)) :
Objets qui bougent pas :
- Un collider seul est normalement "statique". Il ne faut pas le bouger sous peine de consommation important de ressources machines => parfait pour tes murs. Comme il n'est pas sensé bouger, il ne teste pas ses collision à lui, donc deux collider simple ne généreront pas de collisions.

Alors pour les objets qui bougent :
- rigidbody iskinematic représente un objet qui ne subit aucune regle de physique : ni la gravité, ni les collision. En revanche, il peut bouger et impacter les atres rigidbody. Attention : un autre rigidbody isKinematic n'étant, lui non plus pas impacté par la physique, aucune collision n'aura lieu.
- rigidbody "normal" représente ce qui bouge "vraiment" et qui doit réagir à la physique. ton paddle, si il doit bouger ET etre impacté par la physique (toucher tes murs et etre bloqué), il doit donc être rigidbody-tout-court.

Mais alors, comment bloquer un objet pour pas qu'il réagisse à toutes les lois "réelles" de la physiques (a savoir bouger dans tous les sens s'il est touché) ?
Plusieurs possibilités : utiliser les "constraints" du rigidbody pour bloquer tout ce qui est rotation et autoriser le déplacement que sur l'axe qui t’intéresse. Ou par code, dans le FixedUpdate (comme l'update mais pendant les calculs liés à la physique).

Note : pour te simplifier la vie, tu peux utiliser .MovePosition(...) de ton rigidbody, sans utiliser les forces. Cette fonction calculera d'abord que l'objet "peut" bouger là ou tu veux avant. Si un mur le bloque sur la trajectoire, il s’arrêtera au niveau du mur : http://docs.unity3d.com/ScriptReference ... ition.html
Flavien - Social networkons ! Twitter - Google+ - Facebook
Image

Avatar de l’utilisateur
ZJP
Messages : 5748
Inscription : 15 Déc 2009 06:00

Re: Comment forcer un objet à rester sur sa position

Message par ZJP » 17 Mars 2015 23:41

NDrew a écrit :J'aime bien ces nouveau arrivant plein de certitude, c'est drole d'être jeune et naif... profitez bien de votre jeunesse avant de devenir des vieux cons comme nous :) ...
Cela dit, je suis quasi certain qu'on a tous "calés" à un moment ou un autre avec les réactions entre objets physiques sous Unity. :mrgreen:
Pas vrai?! :lol:

dejam0rt
Messages : 17
Inscription : 16 Mars 2015 23:46

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 18 Mars 2015 01:20

Alors, je vais essayé de répondre dans l'ordre :

@Alesk : La fonction AddForce n'a rien à voir là dedans :roll:

@NDrew : Je vais passer au dessus du "naïf" en te rappelant au passage qu'il y a l'opposé : ceux qui ont tellement de connaissance dans leur domaine qu'il ne se rende plus compte que ce domaine comporte des failles. Une sorte de naïveté, si voit ça avec un peu de recul...
Les contraintes, si je comprend bien, c'est du scripting, pas quelque chose de gérable via l'interface de Unity. C'est bien ça? Si c'est le cas, cela pourrait - a priori - régler mon problème. D'ailleurs c'est ce que je disais 6 posts plus haut (cf. "private ToiTuBougesPasQuoiquilarrive").
Mais du coup faire du scripting là ou il suffirait d'une simple à cocher sur l'interface? Ou l’antithèse de l'ergonomie et de l'intuitivité.

@LudlowFx Pas faux, l'option "static" a plusieurs utilités. Mais avouons... Quand même... Si on coche cette case, pourquoi l'objet est-il toujours dépendant de la physique, puisqu'il n'est pas sensé bouger? Au lieu de ça, faut faire un script... dommage non?

@manthoR Merci pour la tentative d'explication, sincèrement. Hélas je savais déjà tout ça. Pour répondre à ta première question, je ne peux pas mettre de rigidbody sur le paddle car la balle le pousserait vers le bas lors de la collision.

Je tiens quand même à émettre une hypothèse : sachant que la balle ne pousse pas mon mur lors de la collision, bien qu'elle ait un rigidbody, j'en déduit que mon paddle avec rigidbody le pousse parce que c'est moi qui le fait bouger. Peut-être me fourvoie-je, mais je pense que c'est parce que lors de la collision, mon paddle applique une force continue sur le mur, alors que la balle change de direction grâce à la physique. Je pense que je vais repartir à zéro en suivant le tuto donné par giyomuSan et quand je serai un peu plus à l'aise avec le scripting, je trouverai un moyen de forcer un objet à rester sur sa position, quelque soit l'évolution événementielle.

Avatar de l’utilisateur
manthoR
Messages : 180
Inscription : 15 Mai 2014 11:43
Localisation : Paris, France
Contact :

Re: Comment forcer un objet à rester sur sa position

Message par manthoR » 18 Mars 2015 01:56

Comme Ndrew l'a dit et d'autres aussi (moi y compris), tu peux ajouter des contraintes à un rigidbody
=> https://docs.google.com/file/d/0BzuKAg_ ... NaN2taNk0/ en bas.

tu "freeze" la position sur les deux axes que tu souhaites bloquer et tu freeze les rotations et voilà.
Et je maintiens tes murs n'ont pas besoin de rigidbody.

Mais oui fais un tutoriel de A à Z ca sera plus clair.
Flavien - Social networkons ! Twitter - Google+ - Facebook
Image

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: Comment forcer un objet à rester sur sa position

Message par LudlowFx » 18 Mars 2015 02:50

Un script pour mettre en place des contraintes sur un Rigidbody ? Pourquoi ? Le component lui-même propose ces options. Il faut fouiller l'inspecteur d'Unity aussi... Et quand bien même, un mur (GameObject) avec un Collider de base ne bouge pas et bloque un GO Physique qui lui rentre dedans ou lui passe dessus ! Sans pour autant avec un RBody dans ses components.
dejam0rt a écrit :@LudlowFx Pas faux, l'option "static" a plusieurs utilités. Mais avouons... Quand même... Si on coche cette case, pourquoi l'objet est-il toujours dépendant de la physique, puisqu'il n'est pas sensé bouger? Au lieu de ça, faut faire un script... dommage non?

L'option "Static" n'est pas lié à la physique, c'est pour indiquer que tel ou tel GameObject est de type non-amovible, donc non dynamique, donc sujet à être utilisé dans le four. (Ouai moi et le mot Bake dans une phrase Française...).


Rendre un GameObject "Static" et rendre un GameObject physique "statique" (des contraintes donc) sont deux choses différentes et pour deux buts différents.

Edit en route :
Je n'avais pas vu ta réponse Manthor je commence à dormir moi, mais au moins là les contraintes dont tout le monde parles sont claires maintenant.
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

dejam0rt
Messages : 17
Inscription : 16 Mars 2015 23:46

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 18 Mars 2015 03:54

Bah oui j'ai fouillé... et je persiste et signe!

Ce que tu me montres manthoR est apparemment un rigidbody... tout court, et non un rigidbody2D. Et sur les rigidbody2D, pas d'option "contraints".

J'ai testé de placer des physics non 2D sur mes éléments 2D et je n'ai même pas droit à un semblant de collision (ce qui me semble logique après tout)

La gestion du 2D (en terme d'outils dédiés) semble assez récente sur Unity, si je ne m'abuse. Il est donc normale que les développeurs oublient de régler quelques détails.

Merci pour l'aide en tout cas! ;)

Avatar de l’utilisateur
LudlowFx
Messages : 1367
Inscription : 19 Sep 2013 05:50

Re: Comment forcer un objet à rester sur sa position

Message par LudlowFx » 18 Mars 2015 05:09

dejam0rt a écrit :Bah oui j'ai fouillé... et je persiste et signe!

Ce que tu me montres manthoR est apparemment un rigidbody... tout court, et non un rigidbody2D. Et sur les rigidbody2D, pas d'option "contraints".

J'ai testé de placer des physics non 2D sur mes éléments 2D et je n'ai même pas droit à un semblant de collision (ce qui me semble logique après tout)

La gestion du 2D (en terme d'outils dédiés) semble assez récente sur Unity, si je ne m'abuse. Il est donc normale que les développeurs oublient de régler quelques détails.

Merci pour l'aide en tout cas! ;)
Heu sérieusement ?... Quant est-ce que tu comptais le préciser que tu avais ajouté un Rigidbody2Det non un simple Rigidbody ? C'est la première fois que tu en fais mention depuis le début de ton sujet qu'il est de type 2D. (D'ailleurs la mention 2D tout court)

A part si j'ai loupé une maj au sujet de la physique 2D depuis la 43, il n'y a pas de contraintes dans l'inspecteur comme un Rigidbody. Mais si tu nous l'avais précisé cela aurait été plus simple...
dejam0rt a écrit :Salut

J'apprends Unity3D en me faisant la main sur un jeu type Arkanoid et j'ai un gros problème concernant les collisions. Je n'arrive pas à trouver une fonction, ou plutôt un bout de script qui me permettrait de forcer un objet à rester sur sa position quoiqu'il se passe dans le jeu. Autrement dit, mon paddle pousse le mur. Je suis obligé de placer un Rigibody sur l'un de ces éléments ; si je le met sur mon paddle, la balle pousse le paddle vers le bas, si je met le Rigibody sur le mur c'est le mur qui est poussé par le paddle. J'ai l'impression d'avoir tout essayé au niveau de l'interface elle-même. J'imagine donc que cela se passe au niveau scripting mais en tant que débutant je n'ai aucune idée de comment développer cette fonction.

Quelqu'un aurait-il une idée à me suggérer?
Je reprends depuis le début car avec toutes ces réponses ça devient le bordel.

Paddle : Tu es obligé d'avoir un rigidbody2D dessus ? Il est contrôlé par de la physique ? Si "non" alors vire le. Si oui, vu que c'est lui que tu dirige via script ajoute une contrainte dans le FixedUpdate pour lui bloquer sa position sur Y à 0 (en prenant l'exemple que Y:0 soit la position initiale de ton paddle)

Balle : Bon bah là physique sinon la pauvre. Avec un physic2Dmaterial pour le Bounce.

Murs : Collider2D simple pas de Rigidbody.

Même si ton paddle contient un component Rigidbody2D et qu'il tape les murs ils ne bougeront pas. Et le freeze Y:0 empêchera ce dernier de se faire dégager par la balle. Après vu que nous n'avons pas l'ensemble des paramètres que tu as attribués à tes divers composants (paddle, mur, balle...) il suffit parfois d'un seul paramètre que tu aurais défini sur x ou y pour que l'aide apporté tombe à l'eau.

Bon moi il est 4h du mat je retourne bosser.
Merci de lire et de prendre en considération la Nétiquette des Forums avant de poster un sujet !

Répondre

Revenir vers « (C#) CSharp »