Contrôler un personnage

Tous les tutoriaux unity, de la communauté ou d'ailleurs.
Avatar de l’utilisateur
GTSAReeper
Messages : 230
Inscription : 21 Juil 2013 02:12
Localisation : Creuse - Limousin

Contrôler un personnage

Message par GTSAReeper » 25 Juin 2014 17:42

Passant mon brevet demain et ayant tellement réviser #Joke je souhaite vous faire un petit tuto pour les débutant ;).

Ce tutoriel va porter sur les mouvement avec un CharacterController car il est plus facile à prendre en main et je préfère.

Let's GO !

Alors je code en c# mais je vais essayer des vous faire le code en c# et en Js ;)

Tout d'abord créons notre script , moi je l’appellerais MyMoveTest.

Nous allons commencer par écrire une ligne qui va directement ajouter le compenent CharacterController

code c#

Code : Tout sélectionner

[RequireComponent (typeof(CharacterController))]
code Js

Code : Tout sélectionner

@script RequireComponent(CharacterController)
Nous allons ensuite créer quelque variable élémentaire comme par exemple : la vitesse de course , de marche , de saut , la gravité

code c#

Code : Tout sélectionner

    
    public float walk = 6.0F;
    public float run = 10.0f;
    public float crouchSpeed = 4.0F;
    public float jumpSpeed = 8.0F;
    public float gravity = 20.0F;
code Js

Code : Tout sélectionner

	public var walk : float = 6.0;
	public var run : float 10.0;
	public var crouchSpeed : float = 4.0;
	public var jumpSpeed : float = 8.0;
	public var gravity : float =  20.0;
Cela devrait ressembler a ça :

code c#

Code : Tout sélectionner

	using UnityEngine;
	using System.Collections;

	[RequireComponent(typeof(CharacterController))]

	public class MyMoveTest1 : MonoBehaviour
	{
	    public float walk = 6.0F;
	    public float run = 10.0f;
	    public float crouchSpeed = 4.0F;
	    public float jumpSpeed = 8.0F;
	    public float gravity = 20.0F;

	    void Start()
	    {

	    }

	    void Update()
	    {

	    }
	}
code Js

Code : Tout sélectionner

	#pragma strict

	@script RequireComponent(CharacterController)

	public var walk : float = 6.0;
	public var run : float = 10.0;
	public var crouchSpeed : float = 4.0;
	public var jumpSpeed : float = 8.0;
	public var gravity : float =  20.0;

	function Start () {

	}

	function Update () {

	}
Après une chose importante a savoir , pour se déplacer du moins en 3d il faut utiliser un Vector3 ! (Pas obliger mais plus utiliser)
Donc pour sa il faut créer une variable qui va stocké la position .

code c#

Code : Tout sélectionner

private Vector3 moveDirection = Vector3.zero;
code c#

Code : Tout sélectionner

private var moveDirection : Vector3 = Vector3.zero;
Nous allons terminer en créant une variable SUPER IMPORTANTE !!!!!
Elle nous servira a acceder au CharacterController.

code c#

Code : Tout sélectionner

	CharacterController controller;

	void Start () {
        controller = GetComponent<CharacterController>();
	}

	
code Js

Code : Tout sélectionner

	private var controller : CharacterController;

	function Start () {
		controller = GetComponent("CharacterController");
	}

	
A noter que je récupère le compenent CharacterController dans la fonction Start.

Bon les variable sont créer nous pouvons souffler un peu :)

Maintenant que vous êtes reposez , on va enfin créer le système de mouvement.

Dans la vrai vie nous ne pouvons pas nous déplacer quand on saute , sauf si nous avons un jetpack ;) donc nous voulons vérifier SI le joueur et a terre ou bien en l'air pour sa rien de plus simple grâce au CharacterController.
Il faut juste utiliser ceci :

code c#/Js

Code : Tout sélectionner

	if(controller.isGrounded){
	
	}
	
Vous voyez , c'est pas dur :)
Créons la direction que nous stockons dans nôtre variable moveDirection :

code c#

Code : Tout sélectionner

	moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
	
code Js

Code : Tout sélectionner

	moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); // La différence n'est pas flagrante mais il ne faut pas mettre le new devant Vector3
	
Nous voulons ensuite que la direction ne soit pas la direction du monde mais du personnage nous utiliserons donc TransformDirection

code c#/Js

Code : Tout sélectionner

	moveDirection = transform.TransformDirection(moveDirection); //Cela veut dire que nous voulons utiliser la direction de moveDirection qui je le rappelle et sur notre joueur
	
Appliquons la vitesse de déplacement

code c#/Js

Code : Tout sélectionner

 moveDirection *= walk;
Si vous lancez vôtre jeu vous remarquerez qu'il ne se passe rien , et bien c'est normal ;) il faut utiliser une méthode du CharacterController , vous voyez comment il nous simplifie la vie .

La méthode est toute simple :

code c#/Js

Code : Tout sélectionner

controller.Move(moveDirection * Time.deltaTime);
Nous allons juste rajouter une ligne qui va gérer la gravité

code c#/Js

Code : Tout sélectionner

moveDirection.y -= gravity * Time.deltaTime;
Ce qui donne ça :

code c#

Code : Tout sélectionner

	using UnityEngine;
	using System.Collections;

	[RequireComponent(typeof(CharacterController))]

	public class MyMoveTest1 : MonoBehaviour
	{
	    public float walk = 6.0F;
	    public float run = 10.0f;
	    public float crouchSpeed = 4.0F;
	    public float jumpSpeed = 8.0F;
	    public float gravity = 20.0F;

	    private Vector3 moveDirection = Vector3.zero;

	    CharacterController controller;
	    

	    void Start()
	    {
	        controller = GetComponent<CharacterController>();
	    }

	    void Update()
	    {
	        if (controller.isGrounded)
	        {
	            moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
	            moveDirection = transform.TransformDirection(moveDirection);
	            //Multiply it by walk.
	            moveDirection *= walk;
	        }

	        moveDirection.y -= gravity * Time.deltaTime;
	        controller.Move(moveDirection * Time.deltaTime);   
	    }
	}
code Js

Code : Tout sélectionner

	#pragma strict

	@script RequireComponent(CharacterController)

	public var walk : float = 6.0;
	public var run : float = 10.0;
	public var crouchSpeed : float = 4.0;
	public var jumpSpeed : float = 8.0;
	public var gravity : float =  20.0;

	private var moveDirection : Vector3 = Vector3.zero;

	private var controller : CharacterController;

	function Start () {
		controller = GetComponent("CharacterController");
	}

	function Update () {
		if(controller.isGrounded){
			moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
			moveDirection = transform.TransformDirection(moveDirection);
			moveDirection *= walk;
			 
			
		}
		
		moveDirection.y -= gravity * Time.deltaTime;
		controller.Move(moveDirection * Time.deltaTime);
		
	}
Comment je fait pour sauter :?:

Très simple dans la condition isGrounded on rajoute ceci :

code c#/Js

Code : Tout sélectionner

	if (Input.GetButton("Jump")){
	moveDirection.y = jumpSpeed;}
Voila c'est aussi simple que ça ;)

Moi mon code donne ça (avec les rajout de vitesse) , si vous voulez savoir comment utiliser les différente vitesse du début regardez mon code ou bien demandez moi :)

code c#

Code : Tout sélectionner

using UnityEngine;
using System.Collections;

[RequireComponent (typeof(CharacterController))]

public class MyMoveTest : MonoBehaviour {

    public float walk = 6.0F;
    public float run = 10.0f;
    public float crouchSpeed = 4.0F;
    public float jumpSpeed = 8.0F;
    public float hyperJump = 25.0F;
    public float gravity = 20.0F;

    public bool isFreeze = false;

    //POTION
    public int potionCount;
    public bool potionActive = false;

    private Vector3 moveDirection = Vector3.zero;

    CharacterController controller;
    
	// Use this for initialization
	void Start () {
        controller = GetComponent<CharacterController>();
	}
	
	// Update is called once per frame
	void Update () {

        if (controller.isGrounded)
        {
            //Feed moveDirection with input.
            if (Input.GetKey(KeyCode.LeftShift))
            {
                if (potionActive)
                {
                    moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                    moveDirection = transform.TransformDirection(moveDirection);
                    //Multiply it by run + potion.
                    moveDirection *= run + 5;
                }
                else
                {
                    moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                    moveDirection = transform.TransformDirection(moveDirection);
                    //Multiply it by run.
                    moveDirection *= run;
                }
            }
            else if(Input.GetKey(KeyCode.LeftControl))
            {
                moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                moveDirection = transform.TransformDirection(moveDirection);
                //Multiply it by crouchSpeed.
                moveDirection *= crouchSpeed;
            }
            else
            {
                if (potionActive)
                {
                    moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                    moveDirection = transform.TransformDirection(moveDirection);
                    //Multiply it by walk + potion.
                    moveDirection *= walk + 5;
                }
                else
                {
                    moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
                    moveDirection = transform.TransformDirection(moveDirection);
                    //Multiply it by walk.
                    moveDirection *= walk;
                }
            }

            
            //Jumping
            if (Input.GetButton("Jump"))
                moveDirection.y = jumpSpeed;
        }
        //Applying gravity to the controller
        moveDirection.y -= gravity * Time.deltaTime;
        //Making the character move
        if (isFreeze)
        {

        }
        else
        {
            controller.Move(moveDirection * Time.deltaTime);
        }
       
	}

    void OnGUI()
    {
        string msgFreeze;

        if (isFreeze)
        {
            msgFreeze = "UnFreeze";
        }
        else
        {
            msgFreeze = "Freeze";
        }
        

        if (GUI.Button(new Rect(10, 10, 100, 25), "Potion") && potionCount > 0)
        {
            StartCoroutine(PotionSpeed(10));
        }

        if (GUI.Button(new Rect(10, 40, 100, 25), "Hyper Jump"))
        {
            transform.Translate(new Vector3(0, hyperJump, 0));
        }

        if (GUI.Button(new Rect(10, 70, 100, 25), msgFreeze))
        {
            isFreeze =! isFreeze;
        }
    }

    IEnumerator PotionSpeed(int time)
    {
        potionCount--;
        potionActive = true;
        yield return new WaitForSeconds(time);
        potionActive = false;
    }
}
EDIT : Je veux juste expliquer ce que c'est que le Time.deltaTime et pour ce faire j’utiliserais l'explication de cayou :
En effet, il est vivement recommandé d'utiliser Time.deltaTime lors de déplacement sur la durée.
Pour comprendre un peu mieux le pourquoi du comment, il faut comprendre ce qu'est déjà Time.deltaTime.

Cette variable est le temps qu'il s'est passé entre la frame précédente et celle maintenant, d'où son nom de "delta".

Imaginons l'exemple suivant:

Le PC 1 est capable de faire tourner le jeu à 50 fps (images pas secondes), si je n'utilise pas deltaTime, celà veut dire que 50x par seconde je vais avancer de "speed" sur l'axe Y.
Le PC 2 est capable de faire tourner le jeu à 100 fps, et donc l'objet avancera 100x par seconde de la même valeur "speed".
Au final sur le PC2 pendant la même seconde l'objet aura parcouru deux fois plus de distance.

Maintenant, rajoutons notre deltaTime:
le PC 1 tournes à 50 fps, deltaTime vaudra donc...20ms, et prenons comme valeur pour speed 30.
sur 1 seconde il aura parcouru: 30* 0.0002 * 50(vitesse * deltaTime * nb de frames) = 0.3 unités.

Le PC 2 maintenant, qui tourne à 100 fps, son deltaTime sera deux fois inférieur, à 10ms donc.
Le calcul: 30 * 0.0001 * 100 = 0.3 unités.

On a donc exactement le même résultat.

Voilà pour l'explication, je trouve qu'il est important de comprendre pourquoi on met telle ou telle autre ligne à tel endroit, plutôt que de recopier bêtement...
Dernière édition par GTSAReeper le 03 Juil 2014 10:37, édité 1 fois.
[center]Image[/center]

Pico57
Messages : 576
Inscription : 19 Fév 2013 16:30
Localisation : Cluny

Re: Contrôler un personnage

Message par Pico57 » 25 Juin 2014 18:11

Quoi ? tu passes ton brevet demain ? Retourne réviser !! Tout de suite !!

Très beau travail tout ça, bonne preuve que parmi les jeunes gamins boutonneux il n'y a pas que des kévins emmerdeur atteint d'ignorance aiguë. Ça fait plaisir à voir.

Je dirais que la seule chose qui manque à ce tuto est une explication sur l'origine de tes Inputs, mais sinon, il y a l'essentiel du comportement.
Et juste te relire encore parce qu'il reste quelques petites fautes. C'est rien par rapport à ce qu'on voit souvent, mais pour un tuto, c'est toujours mieux sans . ;)

Félicitations pour ce travail.

Avatar de l’utilisateur
GTSAReeper
Messages : 230
Inscription : 21 Juil 2013 02:12
Localisation : Creuse - Limousin

Re: Contrôler un personnage

Message par GTSAReeper » 25 Juin 2014 18:12

Merci Pico, je retourne de ce pas réviser ;)
[center]Image[/center]

Avatar de l’utilisateur
Franck
Bricoleur
Bricoleur
Messages : 2884
Inscription : 08 Jan 2011 18:43
Localisation : Tours

Re: Contrôler un personnage

Message par Franck » 25 Juin 2014 18:20

Ouais, c'est bon ça.
Merci.
Dés fois j'bug, dés fois j'bug pas.

Avatar de l’utilisateur
GTSAReeper
Messages : 230
Inscription : 21 Juil 2013 02:12
Localisation : Creuse - Limousin

Re: Contrôler un personnage

Message par GTSAReeper » 25 Juin 2014 18:23

Merci Frank ;)
[center]Image[/center]

Avatar de l’utilisateur
NeverSleepNeverDie
Messages : 12
Inscription : 02 Juil 2014 00:00
Localisation : Au pays de la Moutarde (soit dans le 21)
Contact :

Re: Contrôler un personnage

Message par NeverSleepNeverDie » 11 Juil 2014 15:30

Bonjour, quand je tante de l'ajouter sur mon personnage il me met en erreur: " Can't add script. Can't add component 'Controle' because it doesn't exist. Check to see if the file name and class name match. " Je suis en JavaScript.
Ne dors jamais, Ne meurt jamais , Tombe et je te relèverais.
Skillet-Paramore-Evanescence

Avatar de l’utilisateur
boubouk50
ModoGenereux
ModoGenereux
Messages : 6214
Inscription : 28 Avr 2014 11:57
Localisation : Saint-Didier-en-Bresse (71)

Re: Contrôler un personnage

Message par boubouk50 » 11 Juil 2014 16:48

Controle n'est pas un Component valide d'Unity, il n'existe pas, donc Unity ne peut pas l'ajouter, donc le script ne peut pas être utilisé, donc la script ne peut pas être ajouté au GameObject.

Code : Tout sélectionner

@script RequireComponent(CharacterController)
Ce bout de code permet d'ajouter le Component CharacterController au GameObject s'il n'en a pas. Je pense que c'est cette ligne qui t'empêche d'ajouter le script.
La question donc est: As-tu bien recopié ce morceau?
"Ce n'est pas en améliorant la bougie, que l'on a inventé l'ampoule, c'est en marchant longtemps."
Nétiquette du forum
Savoir faire une recherche
Apprendre la programmation

Avatar de l’utilisateur
GTSAReeper
Messages : 230
Inscription : 21 Juil 2013 02:12
Localisation : Creuse - Limousin

Re: Contrôler un personnage

Message par GTSAReeper » 14 Juil 2014 14:42

Voilà ce que je voulait dire , merci Boubouk
[center]Image[/center]

Répondre

Revenir vers « Tutoriaux »