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;
}
}
}
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
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
Je pense que j'ai quelque chose maintenant, merci. – Gota