Oulala je sens que je vais me faire insulter lol, ne jugez pas je debute haha.
Donc voila le code de mon cube qui se déplace :
Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour {
//Propriétés de mouvement
public float inputDelay = 0.1f; //Delay Input
public float rotateVel = 100;
public float vitesseMax = 100;
public float acceleration = 6;
public float zSpeed = 0f;
public float xSpeed = 0f;
public float angleVirage = 1;
Vector3 dir = Vector3.zero;
Quaternion targetRotation;
Rigidbody rBody;
float forwardInput, turnInput;
Vector3 velocity = Vector3.zero;
bool avancer;
float distToGround;
// Use this for initialization
void Start () {
targetRotation = transform.rotation;
avancer = true;
if (GetComponent<Rigidbody>())
{
rBody = GetComponent<Rigidbody>();
}
else
{
Debug.LogError("The character needs a rigidbody.");
}
forwardInput = turnInput = 0;
distToGround = GetComponent<Collider>().bounds.extents.y;
}
// Update is called once per frame
void Update () {
GetInput();
Turn();
Run();
if (isGrounded())
{
//Debug.Log("Au Sol");
}
else
{
//Debug.Log("Dans les airs !!!");
}
}
void OnCollisionEnter(Collision col)
{
if (col.transform.gameObject.name == "Floor1")
{
//Debug.Log("Collision avec Floor1");
}
if (col.transform.parent.name == "Obstacles")
{
Vector3 dir = col.contacts[0].point - transform.position;
dir = -dir.normalized;
zSpeed = dir.z * -20 * (zSpeed / 10);
xSpeed = dir.x * 10;
//Si le mur est a gauche
if (col.transform.position.x < transform.position.x)
{
////xSpeed *= -1;
//zSpeed *= -1;
//if (transform.eulerAngles.y < -90 || transform.eulerAngles.y > 90)
//{
// xSpeed *= -1;
// //zSpeed *= -1;
//}
}
else //Si le mur est a droite
{
if (transform.eulerAngles.y < -90 || transform.eulerAngles.y > 90)
{
xSpeed *= -1;
zSpeed *= -1;
//Si la collision est faible on decale du mur pour pas rester collé
if (zSpeed > 3)
{
xSpeed *= 3;
Debug.Log("Decale : " + zSpeed);
}
Debug.Log("Valeur de z : " + zSpeed);
}
else
{
//Si la collision est faible on decale du mur pour pas rester collé
if (zSpeed > -3)
{
xSpeed *= 3;
Debug.Log("Decale : " + zSpeed);
}
Debug.Log("Valeur de z : " + zSpeed);
}
}
}
if (col.transform.parent.name == "Boosters")
{
zSpeed = vitesseMax;
transform.rotation = col.transform.rotation;
targetRotation = transform.rotation;
}
}
void OnCollisionStay(Collision col)
{
if (col.transform.parent.name == "Obstacles")
{
avancer = false;
}
}
void OnCollisionExit(Collision col)
{
if (col.transform.parent.name == "Obstacles")
{
avancer = true;
}
}
void FixedUpdate()
{
regleXSpeed();
Run();
transform.Translate(velocity);
}
bool isGrounded()
{
return Physics.Raycast(transform.position, -Vector3.up, distToGround+0.1f);
}
public Quaternion TargetRotation
{
get { return targetRotation; }
}
void GetInput()
{
forwardInput = Input.GetAxis("Run");
turnInput = Input.GetAxis("Horizontal");
}
void Turn()
{
if (Mathf.Abs(turnInput) > inputDelay)
{
angleVirage = 1 - (zSpeed / 100);
if (angleVirage < 0.5f) { angleVirage = 0.5f; }
targetRotation *= Quaternion.AngleAxis(rotateVel * turnInput * Time.deltaTime * angleVirage, Vector3.up);
transform.rotation = targetRotation;
}
}
void Run()
{
if (avancer) //Si on est pas en collision avec un mur
{
if (Mathf.Abs(forwardInput) > inputDelay)
{
velocity.z = zSpeed * Time.deltaTime;
velocity.x = xSpeed * Time.deltaTime;
if (vitesseMax > zSpeed)
{
zSpeed += acceleration * Time.deltaTime;
}
}
else
{
velocity.z = zSpeed * Time.deltaTime;
velocity.x = xSpeed * Time.deltaTime;
if (zSpeed > 0)
{
zSpeed -= acceleration * Time.deltaTime * 2;
}
if (zSpeed < 0)
{
zSpeed = 0;
}
}
}
}
void regleXSpeed()
{
if (xSpeed > 0)
{
xSpeed--;
}
if (xSpeed < 0)
{
xSpeed++;
}
if(xSpeed>-1 && xSpeed < 1)
{
xSpeed = 0;
}
}
}
J'ai une methode run qui s'occupe du déplacement, avec une accéleration et une vitesse max. La vitesse a laquelle j'avance est zSpeed.
J'ai rajouté xSpeed pour avoir mon effet de rebond, pour le moment sur les murs a droite de mon cube l'effet est bon. Sauf a trop grande vitesse d'accord lol.
A gauche j'ai pas encore fait, le contenu est en commentaire actuellement.
Ensuite j'ai une méthode turn qui comme son nom l'indique...
Voila voila, et j'essaie donc d'avoir un système de collision le moins sale possible quoi. Je vous avoue que tout n'est pas maîtrisé parfaitement, je débute et le code est peut-être a vomir pour certains habitués... Tout conseil est bon a prendre en tout cas.
Dans cette vidéo, on peut voir a la fin de la vidéo que le kart se prend un mur :
https://www.youtube.com/watch?v=SlRWVTXfZcU
Je recherche quelque chose de similaire avec un mur un peu plus rebondissant. (Donc pas de voiture qui décolle du sol suite a une collision ect...).