Je pense que je pose ici une question que tout le monde a déjà posé cent fois mais mes recherches sur le forum sont restée un peu infructueuses, avec des réponses incomplètes ou qui ne me convenaient pas.
J'essaye donc de développer un petit jeu en 3D, vue de dessus, avec un personnage qui évolue dans un labyrinthe. Donc déplacement ( Joystick Gauche)+ rotation (joystick droit) + collision contre les murs.
Au début, j'ai commencé en utilisant un Translate; j'ai vite compris que cette commande posait des problèmes de collisions. Effectivement mon personnage entrait bien en collision avec les murs MAIS en cas de collisions multiples ( notamment dans les coins ) il passait parfois au travers des murs.
J'ai donc testé en changeant pour la commande MovePosition. Exactement le même problème; comme si la modification n'avait rien changé.
Dernière tentative en date, j'ai essayé d'anticiper le contact avec un RayCast. Le problème se manifeste un peu différemment mais je me retrouve avec le même souci. Quand je tourne le long d'un mur, le personnage fini par pénétrer un peu dedans.
Pareil avec un SphereCast.
Du coup je commence à désespérer et je serais curieux de savoir et comprendre comment vous vous y prendriez pour régler ce souci.
Je vous mets un screen de mon jeu ainsi que la partie de mon code qui concerne le mouvement du personnage.
Merci d'avance pour vos réponses ^^
Code : Tout sélectionner
RaycastHit hit;
Debug.DrawRay(transform.position, new Vector3(-Input.GetAxis(ControlV) * 5, 0, -Input.GetAxis(ControlH) * 5), Color.red);
// Moving
if (!Physics.SphereCast(transform.position, 0.6f, new Vector3(-Input.GetAxis(ControlV) * 5, 0, -Input.GetAxis(ControlH) * 5), out hit, 0.2f))
{
Vector3 Move = new Vector3(-Input.GetAxis(ControlV) * curSpeed * Time.deltaTime, 0, -Input.GetAxis(ControlH) * curSpeed * Time.deltaTime);
GetComponent<Rigidbody>().MovePosition(transform.position + Move);
}
//transform.Translate(Vector3.back * curSpeed * Time.fixedDeltaTime * (Input.GetAxis(ControlH)), Space.World);
//transform.Translate(Vector3.left * curSpeed * Time.fixedDeltaTime * (Input.GetAxis(ControlV)), Space.World);
// Turning head
float x = Input.GetAxis("RotateH" + MasterSceneScript.Player[1]);
float y = Input.GetAxis("RotateV" + MasterSceneScript.Player[1]);
if (x != 0f || y != 0f)
transform.eulerAngles = new Vector3(transform.eulerAngles.x, Mathf.Atan2(x, y) * Mathf.Rad2Deg, transform.eulerAngles.z);