Code : Tout sélectionner
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FlyControler2 : MonoBehaviour {
public float thrust; // position manche de gaz//
public Rigidbody rb; // rigidBody de l'avion //
private float portanceAiles; // portance//
public float x; // Coefficiant de portance des ailes
public float torque; // torque longitudinal => roulis de l'avion//
public float pitch; // torque latéral => cabrage de l'avion//
public float speed; // vitesse de l'avion - world repère//
public float RelativeSpeed; // vitesse de l'avion - local repere//
void Start () {
// recupération du component Rigidbody de l'avion//
rb = GetComponent<Rigidbody>();
// assigne la masse de l'avion //
// !!!! la masse doit etre cohérente, elle est en klogramme !!!! //
rb.mass = 1.0f;
// assigne une pseudo resistance a l'air pour la position//
rb.drag = 1.0f;
// assigne une psudo resistance a l'air pour la rotation//
rb.angularDrag = 2.0f;
}
void Update () {
Vector3 speedV3 = rb.velocity; // => vecteur vitesse de l'avion ( world coordonnées) //
speed = speedV3.magnitude * 3.6f; // => vitesse de l'avion en km/h => 1m/s = 3.6 km/h (world Coordonnée)//
Vector3 RelativeSpeedV3 = Vector3.Project(rb.velocity, transform.forward); // vitesse de l'avion dans l'axe forward de l'avion//
RelativeSpeed = RelativeSpeedV3.magnitude*3.6f; // vitesse de l'avion en km/h ( local coordonées), celle relevée par la sonde Pitot par exemple //
// affichage de speedV3 et RelativeSpeedV3 en debug ( pense a activer "Gizmos" en haut a droite de la fenetre Game) //
Debug.DrawRay( transform.position, speedV3/50.0f , Color.blue); // Debug/trace une ligne bleue pour représenter speedV3 //
Debug.DrawRay( transform.position, RelativeSpeedV3/50.0f, Color.red); // Debug/trace une ligne rouge pour représenter RelativeSpeedV3 //
// ======= TORQUE => prise de roulis de l'avion ======= //
// principalement du a l'action des volets sur les ailes.
// il est évident que si l'avion n'avance pas ( RelativeSpeed = 0), l'actionnement des volet n'as aucun effet
// donc Torque dépend de la vitesse relative de l'avion (Relative Speed)//
float SpeedSpeed = RelativeSpeed*RelativeSpeed; // on stock le carré de la vitesse, ça nous servira plusieurs fois//
torque = -Input.GetAxis("Horizontal") * 0.0005f * SpeedSpeed; // définition de torque
// ==== PITCH => prise d'angle de l'avion (cabrage) ==== //
// principalement du a l'action des volets sur la queue de l'avion.
// tout comme Torque, si RelativeSpeed = 0, les volet n'ont aucun effet sur l'avion
// donc Pitch dépend aussi de la vitesse relative de l'avion (Relative Speed)//
pitch = Input.GetAxis("Vertical") * 0.0005f * SpeedSpeed; // définition de pitch
// ======= PORTANCE ======= //
// la portance est provoqué par la différence de pression au dessus et au dessous de l'aile//
// l'aile bombé sur le haut provoque l'accélération de l'air au dessus de celle -ci//
// ce qui crée une dépression au dessu de l'aile, elle est "aspirée" vers le haut//
// Donc tout comme torque et pitch, fonction du carré de la vitesse (SpeedSpeed)//
portanceAiles = SpeedSpeed * x ;
// ====== THROTTLE ====== //
// manette des gaz //
// ton raisonnement est bon, mais les "palier" sont trop espacé. tu as 0%, 20%, 40%, 60%, 80%, 100%
// mais rien entre les deux, c'est pas assez progressif
// Donc au lieu de GetButtonDown (=true seulement a la fame ou tu presse le bouton
// utilise GetButton (=true a chaque frame ou le bouton est enfoncé
// on est dans une void Update, qui signifie qu'elle s'execute a chaque frame.
// si ton jeux tourne a 30 FPS, Void Update s'execute 30 x par seconde, s'il tourne a 1000 FPS, 1000x par seconde.
// par exemple thrust = thrust + 1.0f :
// => a 30 FPS : thruste passe de 0 a 30 en une seconde ( on a ajouté 30 x 1.0f en une seconde
// => a 1000 FPS : thruste passe de 0 a 1000 en une seconde ( on a ajouté 1000 x 1.0f en une seconde
// pour que l'augmentation soit toujours la même, on utilise Time.deltaTime :
// donc thrust = thrust + 1.0f * Time.deltaTime :
// => a 30 FPS ou 1000 FPS, thrust passera toujours de 0 à 1 en une seconde, quelque soit le framerate/
if (Input.GetButtonDown("throttle+")) { // => tant qu'on appuye sur la commande, on augmente thrust//
thrust += 15.0f * Time.deltaTime; // identique a : thrust = thrust + 15.0f * Time.deltaTime;
// si on appuye pendant 1s sur throttle+, on aura ajouté 15 a thrust
Debug.Log("thrust : " + thrust); // on debug la valeur de throttle uniquement lorque l'on change celle-ci//
}
if (Input.GetButtonDown("throttle-")) { // => tant qu'on appuye sur la commande, on augmente thrust//
thrust -= 15.0f * Time.deltaTime; // identique a : thrust = thrust - 15.0f * Time.deltaTime;
Debug.Log("thrust : " + thrust); // on debug la valeur de throttle uniquement lorque l'on change celle-ci//
}
thrust = Mathf.Clamp(thrust ,0.0f, 100.0f); // on limite la valeur de thrust pour la forcer à rester entre 0.0 et 100.0
// ===== TON PRECEDENT CODE ===== //
//if (thrust < 101)
//{
//if (Input.GetButtonDown("throttle+"))
// {
// thrust = thrust + 20.0f;
// Debug.Log("thrust : " + thrust);
// }
//}
//if (thrust > 1)
//{
// if (Input.GetButtonDown("throttle-"))
// thrust = thrust - 20.0f;
// Debug.Log("thrust : " + thrust);
// }
//}
// ====== APPLICATION DES FORCES et TORQUE ====== //
// thrust s'applique le long de l'axe Forward de l'avion//
// portanceAiles s'applique sur l'axe Up de l'avion//
// on peut donc combiner ces forces :
Vector3 ForceTotal = (transform.forward * thrust *100.0f ) + (transform.up * portanceAiles);
// torque est un couple autour de l'axe forward de l'avion
// pitch est un couple le long de l'axe right de l'avion
// on peut donc combiner ces couple :
Vector3 TorqueTotal = (transform.forward * torque) + (transform.right * pitch);
// on peut donc appliquer tout ça au rigidBody.
// le fait d'avoir combiner les forces est pour l'optimisation, donc pas obligtoire
// mais il est mieux d'appliquer une fois un rigidbody.AddForce plutot que 10x 10 forces différentes.
// Encore une fois on utilise Time.deltaTime, pour la même raison que avant. pour palier aux différence de frameRate.
rb.AddForce( ForceTotal*Time.deltaTime);
rb.AddTorque( TorqueTotal*Time.deltaTime);
// ces deux lignes au dessus remplacent donc les 4 de ton précédent code :
//rb.AddForce(transform.forward * thrust * 10.0f); // En avant
//rb.AddForce(transform.up * portanceAiles); // vers le haut
//rb.AddTorque(transform.forward * torque);
//rb.AddTorque(transform.right * pitch);
}
}
Ton code est fonctionnel ( même avant mes retouche), mais d’après ton autre sujet ( d'ailleurs tu devrait tout combiner tes demandes dans un seul poste pour plus de simplicité pour tout le monde), tu cherche a faire quelque chose de réaliste. Hors ici tu est dans une simulation de vol assez simplifiée, et c'est pas une critique faut bien commencer par quelque chose, je doute pas que tu va petit a petit améliorer tout ça.
Ce que je te conseil pour bien avancer :
- définir des valeurs réelle : taille, poids..etc ( pas facile de simuler de la physique avec de l'a peu près)
- prend le temps de faire des recherche google sur les principe de vol des avions ( un sujet complexe et passionnant, ce ne sera pas une perte de temps c'est certains)
- fait quelques test avec unity sur le maniement des forces/torque/vecteur pour bien te familiariser ( "Help" => "Scripting Référence" est un grand allier)
Encore une fois si t'as des questions, il y aura toujours quelqu'un pour y répondre.