2016-12-23 6 views
1

J'essaie d'ajouter le saut aux commandes de notre script de contrôle mais cela ne fonctionne pas encore et je suis frustré parce que j'ai essayé de le faire fonctionner. Je n'utilise pas de corps rigides et préfère plutôt utiliser la physique basée sur les scripts et - mais plus tard - les rayons (pour détecter le sol). C'est en 3D mais avec une perspective fixe car les personnages sont des sprites (on pense à essayer un style similaire à Do not Starve, Paper Mario etc.). Et la chose que je veux mettre pour l'instant est de sauter vers le haut quand le personnage reste immobile et plus tard sur des sauts qui permettent aussi au personnage de parcourir un peu de distance quand le personnage bouge. Eh bien, vous obtenez l'image. Pour cela, j'ai d'abord besoin de faire du saut - et aussi de la gravité pour redescendre le personnage tout en considérant que le personnage pourrait atterrir sur un sol qui a une hauteur différente de celle du terrain de départ. Ce qui se passe maintenant, c'est que le personnage saute juste un tout petit peu, pas même un saut, puis tombe à l'infini - ou monte indéfiniment quand on appuie à nouveau sur le saut. Alors, comment puis-je résoudre ce problème?Saut sans corps rigide dans l'unité

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 

public class Controls3D : MonoBehaviour 
{ 

    public float player3DSpeed = 5f; 
    private bool IsGrounded = true; 
    private const float groundY = (float) 0.4; 
    private Vector3 Velocity = Vector3.zero; 
    public Vector3 gravity = new Vector3(0, -10, 0); 

    void Start() 
    { 
    } 

    void Update() 
    { 
     if (IsGrounded) 
     { 
      if (Input.GetButtonDown("Jump")) 
      { 
       IsGrounded = false; 
       Velocity = new Vector3(Input.GetAxis("Horizontal"), 20, Input.GetAxis("Vertical")); 
      } 
      Velocity.x = Input.GetAxis("Horizontal"); 
      Velocity.z = Input.GetAxis("Vertical"); 
      if (Velocity.sqrMagnitude > 1) 
       Velocity.Normalize(); 
      transform.position += Velocity * player3DSpeed * Time.deltaTime; 
     } 
     else 
     { 
      Velocity += gravity * Time.deltaTime; 
      Vector3 position = transform.position + Velocity * Time.deltaTime; 
      if (position.y < groundY) 
      { 
       position.y = groundY; 
       IsGrounded = true; 
      } 
      transform.position = position; 
     } 
    } 
} 
+0

La chute sans fin du problème est résolue. Juste dû mettre Velocity.y = 0; après la transform.position = position; sous IsGrounded = true; – Gota

+1

Si vous partez je parie que vous verrez que la vélocité initiale est plus petite que vous ne le pensiez à cause de 'Velocity.Normalize();', donc votre Velocity.y est un nombre entre -1 et 1. Je pense que votre vitesse ascendante devrait être indépendant des deux autres directions, ou, vous devriez probablement normaliser la vélocité chaque fois que vous le modifiez au lieu de seulement quand il est à la terre. C'est-à-dire, pourquoi normaliser dans le cas fondé mais pas ici: 'Velocity + = gravité * Time.deltaTime;'? – Quantic

+0

Je pense que j'ai quelque chose maintenant, merci. – Gota

Répondre

0

Si je devais vous, je pense que je wouldve changé la chose dans un contrôleur de caractère, car cela simplifie le processus, une tonne de ####: P

Si vous figurez dehors vous ne voulez utiliser le CC. Ceci est la solution que j'utilise habituellement:

CharacterController controller = GetComponent<CharacterController>(); 
    // is the controller on the ground? 
    if (controller.isGrounded) 
    { 
     //Feed moveDirection with input. 
     moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); 
     moveDirection = transform.TransformDirection(moveDirection); 



     //Multiply it by speed. 
     moveDirection *= speed; 
     //Jumping 
     if (Input.GetButton("Jump")) 
      moveDirection.y = jumpSpeed; 

    } 
    //Applying gravity to the controller 
    moveDirection.y -= gravity * Time.deltaTime; 
    //Making the character move 
    controller.Move(moveDirection * Time.deltaTime); 

moveDirection est une variable de type Vector3, et la vitesse et jumpSpeed ​​sont des valeurs flottantes publiques utilisées pour modifier la vitesse.

S'il vous plaît NOTE: Contrôleurs de caractères, laissez-vous programmer votre propre physique.