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.
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.
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 ()
{
}
}
Désolé pour la longueur du post et merci d’avance.