[DB-AL] Déplacement d'une limace (C#)

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
Georgi
Messages : 7
Inscription : 26 Août 2016 05:07

[DB-AL] Déplacement d'une limace (C#)

Message par Georgi » 26 Août 2016 05:25

Bonjour à tous,

Je suis actuellement en train de travailler sur un tout petit jeu en 3D dans le cadre de mes cours.
Le but du jeu est d’atteindre le sommet d’une pseudo pyramide en contrôlant une limace.

Image

Comme je suis plutôt graphiste et que je n’ai jamais eu l’occasion de travailler sur un jeu en 3D,
j’ai demandé à un ami programmeur de m’aider. Cependant, nous nous sommes confrontés
à un problème de taille, la physique !

La limace doit se déplacer de manière plus ou moins réaliste. C’est-à-dire en s’accrochant
à toute les surfaces qu’elle rencontre. Pour ce faire, nous utilisons un script en C# sur le bone
à l’avant de la limace.

C’est donc ce crâne que l’on contrôle et non la limace entière. Ainsi, nous avons réussi à obtenir
cet aspect mou si caractéristique d’une limace.

Notre plus grand problème, c’est que la limace bute contre le mur sans vouloir y grimper.
Cela marche plus ou moins lorsque l’on essaye de grimper par le côté mais de face rien à faire.
Il faut aussi noter que lorsque l’on a réussi à adhérer à une surface verticale, la limace ne veut pas
toujours terminer son ascension vers la prochaine surface horizontale.

Il y a également quelques bugs comme la limace qui s’envole ou encore les bones qui se tordent
parfois dans tous les sens mais notre priorité reste de pouvoir grimper aux murs.

Image

Toute aide serait vu comme la providence étant donné que nous pataugeons là-dedans depuis déjà plusieurs jours.

Ci-dessous le script que nous appliquons sur le crâne de la limace suivi de celui sur tous les bones :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class Limace : MonoBehaviour {
	
	private Rigidbody Paslimace;
	public	int			vertical_speed = 30;
	
	void Start () {
		Paslimace = this.GetComponent<Rigidbody> ();		
	}

	void Update () {

		OnCollisionStay (null);
	}
		
	void OnCollisionStay(Collision collisionInfo)	{
		Vector3 l_velocity = new Vector3(0, 0, 0);
		
		if (Input.GetKey ("left")) {			
			l_velocity.x = -50; 
			if (collisionInfo != null)
				if (collisionInfo.gameObject.transform.position.x < this.transform.position.x - 30)
					l_velocity.y = vertical_speed;
			ApplyVel(l_velocity);
		}
		if (Input.GetKey ("right")) {
				l_velocity.x = 50; 
			if (collisionInfo != null)
				if (collisionInfo.gameObject.transform.position.x > this.transform.position.x + 30)
					l_velocity.y = vertical_speed;
			ApplyVel(l_velocity);
		}
		if (Input.GetKey ("up")) {
				l_velocity.z = 50; 
			if (collisionInfo != null)
				if (collisionInfo.gameObject.transform.position.z < this.transform.position.z - 30)
					l_velocity.y = vertical_speed;				
			ApplyVel(l_velocity);
		}
		if (Input.GetKey ("down")) {			
				l_velocity.z = -50; 
			if (collisionInfo != null)
				if (collisionInfo.gameObject.transform.position.z > this.transform.position.z + 30)
					l_velocity.y = vertical_speed;					
			ApplyVel(l_velocity);
		}		
	}

	void	ApplyVel(Vector3 new_velocity)
	{
		if (new_velocity.y != 0)
			Paslimace.velocity = new_velocity;
		else
			Paslimace.velocity = new Vector3(new_velocity.x, Paslimace.velocity.y, new_velocity.z);		
	}	
}

using UnityEngine;
using System.Collections;

public class My_gravity : MonoBehaviour
{
	private Rigidbody	m_body;
	public float		m_gravity = 10;
	private Vector3		m_normal;

	void Start ()
	{
		m_body = this.GetComponent<Rigidbody>();
		m_body.useGravity = false;
	}

	void FixedUpdate ()
	{
		Ray			l_ray;

		l_ray = new Ray(this.transform.position, -this.transform.up);
		if (Physics.Raycast (l_ray))
		{
			m_normal = this.transform.up;
			m_body.AddForce (m_gravity * m_body.mass * -m_normal * 10);
		}
	}

	void Update ()
	{
		
	}
}
Avec les balises CODE, c'est moins long...

Désolé pour la longueur du post et merci d’avance.
Dernière édition par Georgi le 28 Août 2016 01:01, édité 1 fois.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Déplacement d'une limace (C#)

Message par Moi 1971 » 26 Août 2016 09:55

Bonjour,
tu dis :
mais de face rien à faire.
est-ce le cas où il faut appuyer sur la touche "up" ?
Pour les cas où ça marche sur les côtés, ce sont les touches "left" et "right" ?

Georgi
Messages : 7
Inscription : 26 Août 2016 05:07

Re: Déplacement d'une limace (C#)

Message par Georgi » 26 Août 2016 14:55

Oui exactement. En retestant un peu, je me rend compte que la touche up semble fonctionner uniquement sur terrain plat.
Que l'on essaye de grimper à un mur ou que la limace y soit accroché, cette dernière va trembler un peu tout au plus.

Je ne comprend vraiment pas pourquoi :/

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6220
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Déplacement d'une limace (C#)

Message par boubouk50 » 26 Août 2016 15:40

Si le déplacement est horizontal et que tu dois faire avancer ta limace sur un plan vertical, alors elle ne peut plus avancer.
Il faut que le déplacement soit dépendant de la direction de la limace, suivant son forward (local) et pas les axes du monde (world)
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Georgi
Messages : 7
Inscription : 26 Août 2016 05:07

Re: Déplacement d'une limace (C#)

Message par Georgi » 26 Août 2016 16:15

En effet, nous avions évoqué la piste du forward...
Mon ami mais n'est pas encore là, je vais donc voir ce que je peux faire pour le moment avec mes maigres compétences.
Si vous avez de bons tutoriels ou docs qui trainent là-dessus, n’hésitez pas à les envoyer :)

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Déplacement d'une limace (C#)

Message par Moi 1971 » 26 Août 2016 17:34

A mon avis tout pourrait se régler ici :

Code : Tout sélectionner

void FixedUpdate ()
   {
      Ray         l_ray;

      l_ray = new Ray(this.transform.position, -this.transform.up);
      if (Physics.Raycast (l_ray))
      {
         m_normal = this.transform.up;
         m_body.AddForce (m_gravity * m_body.mass * -m_normal * 10);
      }
   }
=>"m_normal = this.transform.up;"

Est-ce que le RigidBody est soumis à la physique d'Unity? Parce que si vous faites un AddForce vers le haut pour le faire avancer mais que juste après la physique d'Unity lui applique la gravité vers le bas?!?...

Georgi
Messages : 7
Inscription : 26 Août 2016 05:07

Re: Déplacement d'une limace (C#)

Message par Georgi » 26 Août 2016 18:48

Il y a un rigidbody sur chaque bones et sur chacun, Use gravity est décoché :

Image
(ceci dit, il y a peut être des valeurs aberrantes restantes d'anciens tests.)

Pour l'utilisation du forward de la limace, j'anticipe un problème auquel nous avions déjà pensé.
Notre caméra est fixe.
Imaginons que le joueur essaye de grimper un mur à sa gauche en appuyant sur left.
Une fois sur le mur, il va logiquement continuer à appuyer sur left pour grimper ce mur.
Cependant, la limace n'avancera pas devant elle mais à sa gauche, non ?
Autrement dit, la direction avant ne sera pas la même pour le joueur ou la limace.
J'avais pensé à un truc un peu sale dans ce genre là :

Code : Tout sélectionner

          if (Input.GetKey ("left")) {
			if (-45 <= this.transform.rotation.y && this.transform.rotation.y < 45)
			l_velocity.x = -50; 
			if (45 <= this.transform.rotation.y && this.transform.rotation.y < 135)
			l_velocity.z = 50;
			if (135 <= this.transform.rotation.y && this.transform.rotation.y < -135)
			l_velocity.x = 50;
			if (-135 <= this.transform.rotation.y && this.transform.rotation.y < -45)
			l_velocity.z = -50;
                        (...)
}

Où selon l'orientation de la limace de la limace, mais je ne sais pas si ça marcherait où s'il y a moyen de mieux l'écrire.

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Déplacement d'une limace (C#)

Message par Moi 1971 » 27 Août 2016 11:14

Georgi a écrit :... ou s'il y a moyen de mieux l'écrire.
Il y a moyen de mieux faire... ça parait bien compliqué pour juste la touche "left".

Georgi
Messages : 7
Inscription : 26 Août 2016 05:07

Re: Déplacement d'une limace (C#)

Message par Georgi » 28 Août 2016 01:26

J'ai essayé autre chose en utilisant la direction de la limace.

Code : Tout sélectionner

void Update () {

		if(Input.GetKey("up")) {
			Paslimace.velocity = transform.right * 5000 * Time.deltaTime;
		}
		else if(Input.GetKey("down")) {
			Paslimace.velocity = transform.right * -5000 * Time.deltaTime;
		}
		else if(Input.GetKey("left")) {
			Paslimace.velocity = transform.forward * 3000 * Time.deltaTime;
		}
		else if(Input.GetKey("right")) {
			Paslimace.velocity = transform.forward * -3000 * Time.deltaTime;
		}

	}
Le gros problème, c'est que malgré mes bidouillage dans les paramètres la limace se déforme très mal. Elle s'envolait également lorsque l'on utilise la touche "up" mais en cherchant un peu, j'ai découvert que la tête s'orientait légèrement en lançant le jeu.
Or ce n'est plus le cas lorsque je désactive le script que l'on utilise pour la gravité :

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

public class My_gravity : MonoBehaviour
{
	private Rigidbody	m_body;
	public float		m_gravity = 10;
	private Vector3		m_normal;

	void Start ()
	{
		m_body = this.GetComponent<Rigidbody>();
		m_body.useGravity = false;
	}

	void FixedUpdate ()
	{
		Ray			l_ray;

		l_ray = new Ray(this.transform.position, -this.transform.up);
		if (Physics.Raycast (l_ray))
		{
			m_normal = this.transform.up;
			m_body.AddForce (m_gravity * m_body.mass * -m_normal * 10);
		}
	}

	void Update ()
	{
		
	}
}
Le but de ce script était de faire adhérer la limace à n'importe quelle surface. Y aurait-il un autre moyen pour nous de faire ça ?

Moi 1971
Messages : 727
Inscription : 29 Sep 2015 13:38

Re: Déplacement d'une limace (C#)

Message par Moi 1971 » 28 Août 2016 10:52

Georgi a écrit : Elle s'envolait également lorsque l'on utilise la touche "up"
Votre technique semble bien complexe...
Georgi a écrit : Le but de ce script était de faire adhérer la limace à n'importe quelle surface. Y aurait-il un autre moyen pour nous de faire ça ?
Oui il y a plein de tuto un peu partout sur le sujet. Avec la physique, sans la physique, avec RayCast, avec OnCollision,etc..

Répondre

Revenir vers « (C#) CSharp »