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 : Tout sélectionner
@script RequireComponent(CharacterController)
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 : 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;
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 : 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 () {
}
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 : Tout sélectionner
private var moveDirection : Vector3 = Vector3.zero;
Elle nous servira a acceder au CharacterController.
code c#
Code : Tout sélectionner
CharacterController controller;
void Start () {
controller = GetComponent<CharacterController>();
}
Code : Tout sélectionner
private var controller : CharacterController;
function Start () {
controller = GetComponent("CharacterController");
}
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){
}
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 : 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
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
code c#/Js
Code : Tout sélectionner
moveDirection *= walk;
La méthode est toute simple :
code c#/Js
Code : Tout sélectionner
controller.Move(moveDirection * Time.deltaTime);
code c#/Js
Code : Tout sélectionner
moveDirection.y -= gravity * Time.deltaTime;
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 : 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);
}
Très simple dans la condition isGrounded on rajoute ceci :
code c#/Js
Code : Tout sélectionner
if (Input.GetButton("Jump")){
moveDirection.y = jumpSpeed;}
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;
}
}
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...