IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Unity Discussion :

Marcher sur les murs


Sujet :

Unity

  1. #1
    Membre du Club
    Homme Profil pro
    ITESCIA
    Inscrit en
    Janvier 2013
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : ITESCIA
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2013
    Messages : 101
    Points : 55
    Points
    55
    Par défaut Marcher sur les murs
    Bonjours à tous,

    Je tente actuellement de créer un personnage (pour l'instant un cube) avec une caméra associée. Ce personnage pourra s'accrocher aux murs et y grimper, la caméra suivant son mouvement (de même au plafond).
    Mon problème, c'est que la camera ne suis pas le personnage comme je le voudrais. De plus les axes de déplacement sont modifiés lorsque je change de mur...

    Voici le script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    using UnityEngine;
    using System.Collections;
     
    public class testCam : MonoBehaviour {
     
    public float moveSpeed = 20;
    public float lerpSpeed = 20;
    public float gravity = 10;
    public float jumpRange = 5;
    public float jumpSpeed = 5;
    public float deltaGround = 0.2f;
     
    private float distGround;
    private bool isGrounded = false;
    private Vector3 myNormal;
    private Camera Pov;
    private RaycastHit hit;
    private Ray ray;
    private Vector3 surfaceNormal;
    private bool jumping;
     
    	// Use this for initialization
    	void Start () {
    	    myNormal = Vector3.up; // normal starts as character up direction
    	    rigidbody.freezeRotation = true; // disable physics rotation
    		distGround = 1;//coll.bounds.extents.y - coll.center.y; 
    		Debug.Log("up " + transform.up);
    		Pov = transform.FindChild("Camera").gameObject.camera;
    	}
     
    	void FixedUpdate() {
    		rigidbody.AddForce(-gravity*rigidbody.mass*myNormal);
    	}
     
    	// Update is called once per frame
    	void Update () {
     
    		if (jumping)
    			return;
     
    		if (Input.GetButtonDown("Jump")) { // jump pressed:
    			hit = new RaycastHit();
    			ray = Pov.ScreenPointToRay(Input.mousePosition);
    			if (Physics.Raycast(ray, out hit, jumpRange)) { // wall ahead?
    				JumpToWall(hit.point, hit.normal); // yes: jump to the wall
    			}  else if (isGrounded) { // no: if grounded, jump up
    				rigidbody.velocity += jumpSpeed * myNormal;        
    			}
    		}
     
    		// Moving forward and backward
    		var forwardVector = Pov.transform.forward;
    		//forwardVector.y = 0;
    		forwardVector *= Input.GetAxis("Vertical");
     
    		transform.Translate(forwardVector*Time.deltaTime*moveSpeed);
     
    		// Moving left and right
    		var lateralVector = Pov.transform.right;
    		//lateralVector.y = 0;
    		lateralVector *= Input.GetAxis("Horizontal");
     
    		transform.Translate(lateralVector*Time.deltaTime*moveSpeed);
     
     
    		// update surface normal and isGrounded:
    		ray = new Ray(transform.position, -myNormal); // cast ray downwards
    		if (Physics.Raycast(ray, out hit)){ // use it to update myNormal and isGrounded
    			isGrounded = hit.distance <= distGround + deltaGround;
    			surfaceNormal = hit.normal;
    		}
    		else {
    			isGrounded = false;
    			// assume usual ground normal to avoid "falling forever"
    			surfaceNormal = Vector3.up;
    		}
     
     
    		myNormal = Vector3.Lerp(myNormal, surfaceNormal, lerpSpeed*Time.deltaTime);
    		Vector3 myForward = Vector3.Cross(transform.right, myNormal);
    		Quaternion targetRot = Quaternion.LookRotation(myForward, myNormal);
    		transform.rotation = Quaternion.Lerp(transform.rotation, targetRot, lerpSpeed*Time.deltaTime);
     
    	}
     
    	void JumpToWall(Vector3 point, Vector3 normal) {
     
    		// jump to wall
    		jumping = true; // signal it's jumping to wall
    		rigidbody.isKinematic = true; // disable physics while jumping
    		Vector3 dstPos = point + normal * (distGround + 0.5f); // will jump to 0.5 above wall
    		Vector3 myForward = Vector3.Cross(transform.right, normal);
    		Quaternion dstRot = Quaternion.LookRotation(myForward, normal);
     
    		for (float t = 0.0f; t < 1.0f; ){
    			t += Time.deltaTime;
    			transform.position = Vector3.Lerp(transform.position, dstPos, t);
    			transform.rotation = Quaternion.Slerp(transform.rotation, dstRot, t);
     
    			//Pov.transform.rotation = transform.rotation;
    			//Pov.transform.position = transform.position;
     
    		}
     
    		myNormal = normal; // update myNormal
    		rigidbody.isKinematic = false; // enable physics
    		jumping = false; // jumping to wall finished
    			Debug.Log("up " + transform.up);
     
    	}
     
    }
    Cela fais désormais plusieurs jours que je suis bloqué par ce problème (mes connaissances Unity n'étant pas très grande).
    J'apprécierai toute aide!!

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2012
    Messages : 104
    Points : 17
    Points
    17
    Par défaut
    Peux-tu me donner des explications claires et détaillées sur ton script, car j'ai un peu de la difficulté à le comprendre. Merci :-)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2012
    Messages : 104
    Points : 17
    Points
    17
    Par défaut
    Malgré tout je crois ne pas en avoir besoin. Sinon, es-tu paramétré en espace local dans Unity?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2012
    Messages : 104
    Points : 17
    Points
    17
    Par défaut
    Un petit conseil, les variables public on les initialise normalement dans Unity. Dans ton cas si tu ne l'a pas fait ca serait bon de le faire . De plus, t'as selon moi des variables qui pourraient et devraient même être déclarées dans le corps de tes fonctions.Bref, je vais tester ton script et je te redonne plus d'info dès que ce sera fait

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2012
    Messages : 104
    Points : 17
    Points
    17
    Par défaut
    Je crois avoir trouvé ton problème: L'orientation de la caméra. La caméra semble avoir beaucoup d'influence sur les axes de déplacement du (joueur) et quand celle ci n'est pas orientée( vecteur d'orientation 0,0,0) le joueur ne semble pas vouloir marcher sur le mur comme tu le souhaiterais. De plus, elle semble avoir de l'influence sur tous les vecteurs de ton script.Je vais essayer de trouver une solution à cela.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Juin 2012
    Messages
    104
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Juin 2012
    Messages : 104
    Points : 17
    Points
    17
    Par défaut
    J'ai trouver le probleme finalement, change ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var forwardVector = Pov.transform.forward;
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var forwardVector = Pov.transform.localPosition * -1;
    J'espere avoir répondu a ta question. Sur ce je te souhaite bonne continuité dans ton projet mec.

Discussions similaires

  1. Marcher sur les murs?
    Par LuluHow dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 12/05/2015, 21h59
  2. publier sur les PAGES facebook et non sur MUR-PROFIL
    Par php_de_travers dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 3
    Dernier message: 19/05/2010, 10h10
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo