Courir sur les murs

Pour les scripts écrits en Javascript (UnityScript). :!: Obsolète :!:
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
3vilGh0st
Messages : 2
Inscription : 03 Avr 2016 13:41

Courir sur les murs

Message par 3vilGh0st » 03 Avr 2016 13:49

Bonjour tout le monde,
alors, voilà, je travaille sur un FPS en ce moment et je cherche à faire en sorte que mon personnage puisse faire des wall run dès que j'appuierai sur Espace et qu'il sera à coté d'un mur, j'ai donc fais un script, le problème c'est qu'il ne remplit pas du tout sa fonction et qu'il est plein de bugs, est ce que vous pourriez me dire si j'ai juste quelques erreurs à corriger et quelques trucs à modifier ou est ce qu'il faut que je recommence tout à zéro parce que rien ne va dans le script ?

Code : Tout sélectionner

var moveSpeed: float = 8;
 var turnSpeed: float = 90;
 var gravity: float = 10;
 var isGrounded: boolean;
 var deltaGround: float = 0.2;
 var jumpSpeed: float = 10;
 var jumpRange: float = 10;
 var Rigibody = GameObject;
 
 private var myNormal: Vector3;
 private var turnAngle: float = 0;
 private var distGround: float;
 private var jumping = false;
 private var vertSpeed: float = 0;
 
function Start(){ myNormal = transform.up;
 GetComponent.<Rigidbody>().freezeRotation = true;
 distGround = GetComponent.<CharacterController>().height / 2 - GetComponent.<CharacterController>().center.y;
 }

 function FixedUpdate(){ GetComponent.<Rigidbody>().AddForce(-gravity * myNormal);
 }
 
function Update(){ var ray: Ray;
 
 var hit: RaycastHit;
 
if (!jumping){
    if (Input.GetButtonDown("Jump")){
        ray = Ray(transform.position, transform.forward);
            if (Physics.Raycast(ray, hit, jumpRange)){
                JumpToWall(hit.point, hit.normal);
            }else if (isGrounded){
                vertSpeed = jumpSpeed;
        }}else {
            var turn = Input.GetAxis("Horizontal") * turnSpeed * Time.deltaTime;
            turnAngle = (turnAngle + turn) % 360;
            ray = Ray(transform.position, -myNormal);
                if (Physics.Raycast(ray, hit)){
                    isGrounded = hit.distance <= distGround + deltaGround;
                    myNormal = Vector3.Lerp(myNormal, hit.normal, Time.deltaTime);
                }else {
                    isGrounded = false;
                }
            var rot = Quaternion.FromToRotation(Vector3.up, myNormal);
            rot *= Quaternion.Euler(0,turnAngle,0);
            transform.rotation = rot;
            var move = Input.GetAxis("Vertical") * moveSpeed * Vector3.forward;
            move.y = vertSpeed;
            transform.Translate(move * Time.deltaTime, Space.Self);
            vertSpeed -= gravity * Time.deltaTime;
            if (vertSpeed < 0) {vertSpeed = 0;}
}}}
function JumpToWall(point: Vector3, normal: Vector3){ jumping = true;
 GetComponent.<Rigidbody>().isKinematic = true;
 var orgPos = transform.position;
 var orgRot = transform.rotation;
 var dstPos = point + normal * (distGround + 0.5);
 var dir = dstPos - orgPos;
 var dstRot = Quaternion.FromToRotation(Vector3.up, normal);
 dstRot *= Quaternion.Euler(0, turnAngle, 0);
 for (var t: float = 0.0; t < 1.0; ){ t += Time.deltaTime; transform.position = Vector3.Lerp(orgPos, dstPos, t);
 transform.rotation = Quaternion.Slerp(orgRot, dstRot, t);
 yield;
 } myNormal = normal;
 GetComponent.<Rigidbody>().isKinematic = false;
 jumping = false; }
Balises code svp, un titre explicite et en français c'est mieux aussi. Lire la Netiquette. Merci

Avatar de l’utilisateur
Max
Messages : 8807
Inscription : 30 Juil 2011 13:57
Contact :

Re: Courir sur les murs

Message par Max » 03 Avr 2016 14:04

Bonjour,
3vilGh0st a écrit :le problème c'est qu'il ne remplit pas du tout sa fonction
C'est à dire ? que se passe-t-il ? Quel résultat précis attends-tu et de fait, quel est celui que tu as ? (un/des screens)
3vilGh0st a écrit :et qu'il est plein de bugs
Lesquels ? Si tu as des messages d'erreur, indique les.

Plus tu seras précis et exhaustif dans la description de ton problème, plus il sera facile à des personnes de t'aider, ou au moins de t'aiguiller.
Image
Pas d'aide par MP, le forum est là pour ça.
En cas de doute sur les bonnes pratiques à adopter sur le forum, consulter la Charte et sa FAQ

3vilGh0st
Messages : 2
Inscription : 03 Avr 2016 13:41

Re: Courir sur les murs

Message par 3vilGh0st » 03 Avr 2016 14:11

Salut, en fait je voudrais comme je l'ai dis plus haut que mon personnage court sur les murs lorsqu'on appuie sur espace et qu'on est proche d'un mur et le résultat que j'obtiens n'est pas du tout ce que j'attend, je ne peux pas wall runner avec mon personnage, l'action se lance le personnage commence à se retourner sauf qu'il se remet debout sur le sol directement après.

Pour les bugs, je n'ai pas de messages d'erreur mais je n'obtiens pas ce que je veux et j'ai des bugs lorsque je joue : quand je m'approche d'une mur, une sorte de force m'invisible me repousse et me fait ralentir quand je m'en approche, une fois que j'ai fais une fois un "wall run" dès que j'appuie sur les touches pour le déplacement vertical le perso part très rapidement en arrière quoi que je fasse et je suis obligé de redémarrer le jeu pour que le bug disparaisse et que je puisse me redéplacer normalement.

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

Re: Courir sur les murs

Message par Moi 1971 » 03 Avr 2016 17:29

Bonjour,
Dans ton code il n'y a pas une seule ligne de commentaire! Comment fais-tu pour t'y retrouver?
juste en regardant comme ça ton code, je dirais que tu utilise mal la fonction Update(). Celle-ci est appelée plusieurs fois par seconde. Et dans celle-ci tu appels la fonction JumpToWall() qui fait une boucle qui dure une seconde pour, je pense, faire "basculer" ton perso sur le mur. Et tu mets ton bool "jumping" à false seulement à la fin du bloc de code, donc sûrement au bout d'une seconde. La fonction Update() à le temps d'être rappelée plusieurs fois dans le même temps et de relancer des fonctions JumpToWall() à chaque fois . Donc déjà si ton code est fonctionnel, je déplacerai la ligne
"jumping = false;" dans l'update() juste ici :

Code : Tout sélectionner

if (!jumping){
    if (Input.GetButtonDown("Jump")){
        ray = Ray(transform.position, transform.forward);
            if (Physics.Raycast(ray, hit, jumpRange)){
                jumping = false;
                JumpToWall(hit.point, hit.normal);
                ....
                ...
                ..
                
En suite, pour voir comment se déroule vraiment le code, je mettrais de Debug.Log("") un peu partout...

Verrouillé

Revenir vers « (Js) Javascript »