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
dejam0rt
Messages : 17
Inscription : 16 Mars 2015 23:46

Comment forcer un objet à rester sur sa position

Message par dejam0rt » 17 Mars 2015 00:15

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?

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 01:08

Yo !

Utilise le rigidbody sur la balle uniquement.

Si t'es obligé d'avoir un rigidbody sur un élément que tu veux garder immobile quand il entre en collision, il faut cocher la case "is kinematic" du rigidbody

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

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 17 Mars 2015 02:00

Merci pour la réponse rapide, malheureusement cela ne marche pas. En fait j'avais déjà testé. Si je coche "isKinematic" dans le rigibody de mon mur, mon paddle passe carrément au travers, si je décoche la case, le paddle pousse mon mur... Je crois bien avoir essayé toutes les possibilités au niveau de l'interface. Peut-être cela se passe-t-il au niveau du script de mon paddle (une des variables/fonctions le ferait traverser les éléments malgré les bonnes options cochées?). Du coup je vous mets mon PlayerScript, au cas. Si ce n'est pas ça, je serai obligé de passer par un script pour mon mur, non?

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour {
	
	public float playerVelocity;
	private Vector3 playerPosition;
	private int playerLives;
	private int playerPoints;
	
	// Use this for initialization
	void Start () {
		// get the initial position of the game object
		playerPosition = gameObject.transform.position;

		playerLives = 3;
		playerPoints = 0;
	}


	void addPoints(int points){
		playerPoints += points;
	}

	void OnGUI(){
		GUI.Label (new Rect(5.0f,3.0f,200.0f,200.0f),"Live's: " + playerLives + "  Score: " + playerPoints);
	}

	void TakeLife(){
		playerLives--;
	}

	// Update is called once per frame
	void FixedUpdate () {




		// horizontal movement
		playerPosition.x += Input.GetAxis ("Mouse X") * playerVelocity;

		// update the game object transform
		transform.position = playerPosition;
		
		// leave the game
		if (Input.GetKeyDown(KeyCode.Escape)){
			Application.Quit();
		}




	



	}
}

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Comment forcer un objet à rester sur sa position

Message par giyomuSan » 17 Mars 2015 02:33

Utilise les constraint dans ton rigidbody pour determiner les pour la position et rotation que tu veux fixe.

Ou alors tu peu simplement marquer les objet en "static" dans ce cas pas besoin de rigidbody ( pour tes murs par example ), les collision fonctioneront.

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

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 17 Mars 2015 02:58

Il me semble qu'il faut au moins un des objets qui ait un rigibody pour qu'il y ait une collision, non?

J'ai tout essayé au niveau de l'interface de Unity je pense vraiment que c'est une question de script. C'est bizarre quand-même... Un outil aussi puissant et bien pensé comme Unity qui ne dispose pas d'une fonction aussi basique :?

Avatar de l’utilisateur
giyomuSan
Messages : 1799
Inscription : 09 Déc 2009 14:52
Localisation : Japon

Re: Comment forcer un objet à rester sur sa position

Message par giyomuSan » 17 Mars 2015 03:46

Si un collider est marquer static tu n as pas besoin d avoir un rigidbody dessus, generalement tes murs sont fixe et en bouge pas , si tu les marque static, le paddle n aura aucun effet dessus, mais il prendra la collision du mur avec le mur en compte

ensuite sur le paddle il te suffit de mettre juste une constraint position en Y et aussi figer tout les axes de rotations.

http://docs.unity3d.com/Manual/class-Rigidbody.html


tu peu jeter un oeil ici aussi , si tu est en panne

http://unity3d.com/learn/tutorials/modu ... akout-game

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

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 17 Mars 2015 15:57

Bon! J'ai enfin trouvé la réponse à ma question : on ne peut pas forcer un objet à rester sur sa position quelque soit les événements. Donc pour stopper un élément mu par le joueur, il faut limiter les déplacements dudit élément et ne pas compter sur les colliders.

Merci pour le lien du tuto giyomuSan, cela m'a permis de comprendre mon problème. En tout cas je réitère : ne pas pouvoir forcer un objet à rester sur sa position est assez incroyable vu la puissance d'édition que propose Unity ; cela limite l'intuitivité du soft. Mais après tout, rien ne peut être parfait.

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 20:08

Nope, c'est toi qui t'y prends mal.

- si l'objet a un collider mais n'a pas de rigidbody, il ne bougera pas lors d'une collision
- si l'objet a un rigidbody avec "is kinematic" coché, il ne bougera pas non plus

Si tu fais bouger ce genre d'objet avec un script, c'est alors aussi à ton script de gérer les arrêts correctement, ou de mieux gérer la façon de déplacer l'objet.

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 20:56

Alesk a écrit :Nope, c'est toi qui t'y prends mal.
:mrgreen: Non, tu crois?!
dejam0rt a écrit :En tout cas je réitère : ne pas pouvoir forcer un objet à rester sur sa position est assez incroyable vu la puissance d'édition que propose Unity ; cela limite l'intuitivité du soft. Mais après tout, rien ne peut être parfait.
Lol. Quel certitude jeune Padawan !!!. :roll:
Ils (UT) sont arrivés à la version 5 en loupant ce genre de chose. Mouais....

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

Re: Comment forcer un objet à rester sur sa position

Message par dejam0rt » 17 Mars 2015 21:15

Alesk a écrit : - si l'objet a un collider mais n'a pas de rigidbody, il ne bougera pas lors d'une collision
Exact. Je ne peux pas mettre de rigidbody à mon paddle, donc je suis obligé de le mettre sur mon mur pour créer une collision entre ces éléments.
Alesk a écrit : - si l'objet a un rigidbody avec "is kinematic" coché, il ne bougera pas non plus
Exact. Avec le "isKinematic" coché sur le rigidbody de mon mur, mon paddle ne pousse pas le mur... puisqu'il le traverse :D
Alesk a écrit :Nope, c'est toi qui t'y prends mal.
Si tu fais bouger ce genre d'objet avec un script, c'est alors aussi à ton script de gérer les arrêts correctement, ou de mieux gérer la façon de déplacer l'objet.
Que je m'y prenne mal je veux bien le croire, je suis débutant. Par contre, il est clair que l'option "cet objet ne bouge pas quelque soit les événements dans le jeu" n'existe pas (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...)
Je suis sûr qu'il existe un script que je pourrais appliquer à mon mur, qui dirais un truc du genre "private ToiTuBougesPasQuoiquilarrive". Malheureusement je ne l'ai pas trouvé et d'ailleurs dans les tutos que j'ai trouvé, aucun ne mentionne cette façon de faire, tous utilisent une fonction qui limite les déplacement du player.
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 :)
ZJP a écrit : Lol. Quel certitude jeune Padawan !!!. :roll:
Ils (UT) sont arrivés à la version 5 en loupant ce genre de chose. Mouais....
Adobe Photoshop, leader incontesté de la PAO/DAO, qui en est a sa 158eme version, n'a toujours pas de color picker en forme de triangle, pourtant réputé comme le plus intuitif et ergonomique. Même les meilleurs font des erreurs. Et ça c'est une certitude 8-)

Répondre

Revenir vers « (C#) CSharp »