Aujourd'hui, j'essaie de créer un contrôleur de caractères 2D avec unité (en utilisant la phisique). Je suis assez nouveau dans les moteurs physiques et il est vraiment difficile d'obtenir la sensation de contrôle que je recherche. Je serais vraiment heureux si quelqu'un pouvait suggérer une solution à un problème que je trouve:
Ceci est mon FixedUpdate en ce moment:
public void FixedUpdate()
{
Vector3 v=new Vector3(0,-10000*Time.fixedDeltaTime,0);
_body.AddForce(v);
v.y=0;
if(state(MovementState.Left))
{
v.x=-_walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=-_maxWalkSpeed;
}
else if(state(MovementState.Right))
{
v.x= _walkSpeed*Time.fixedDeltaTime+v.x;
if(Mathf.Abs(v.x)>_maxWalkSpeed) v.x=_maxWalkSpeed;
}
_body.velocity=v;
Debug.Log("Velocity: "+_body.velocity);
}
J'essaie ici de déplacer simplement le corps rigide en appliquant une gravité et une force linéaire pour la gauche et la droite. J'ai mis en place un matériau physique qui ne fait aucun rebond et 0 frottement lors du déplacement et 1 frottement avec l'arrêt. Le problème principal est que j'ai des collisionneurs avec des pentes et que la vitesse change de monter (plus lentement), de descendre la pente (plus vite) et de marcher sur un collisionneur droit (normal). Comment cela pourrait-il être corrigé? Comme vous le voyez, j'applique toujours la même vitesse pour l'axe des x.
Pour le joueur, je l'ai configuré avec une sphère à la position des pieds qui est le corps rigide auquel j'applique des forces.
Toute autre astuce qui pourrait me faciliter la vie avec cela est la bienvenue :).
PD En rentrant chez moi, j'ai remarqué que je pouvais résoudre ce problème en appliquant une force constante parallèle à la surface sur laquelle le joueur marche, mais je ne sais pas si c'est la meilleure méthode.
la source
Réponses:
Si vous cherchez à imiter les plateformes de la vieille école, la première étape consiste à abandonner la physique. Vous finirez par combattre le système physique pour obtenir le mouvement décidément non réaliste d'un jeu de plateforme old school. Jetez un œil à ce remplacement de CharacterController qui abandonne complètement la physique pour avoir une bonne idée d'une façon de l'implémenter.
la source
Vous seriez probablement plus heureux de suivre ce que mheona a recommandé. Mais si vous allez utiliser la physique d'Unity, vous voudrez probablement l'utiliser
ForceMode.VelocityChange
.Exemple:
Vous devez également appliquer la gravité globale dans les paramètres de physique de votre projet, et pour les objets que vous souhaitez chuter plus rapidement, ajoutez un composant Force constante .
ForceMode.Impulse
est similaire mais est affecté par la masse du corps rigide. Rend plus difficile à régler.la source
Même si vous n'aimez pas le composant de contrôleur de personnage intégré (comme moi), jetez un œil à l'exemple de code Unity pour le didacticiel de jeu 2D .
Le code implémente un gameplay 2D complet avec des plates-formes mobiles, des ennemis et des boîtes avec collision, en utilisant le contrôleur de personnage.
Mais si vous ne voulez même pas y jeter un œil, je vous suggère de minimiser l'utilisation de la physique et d'essayer de copier son comportement avec votre propre code. Selon le type de jeu 2D que vous prévoyez, il peut fonctionner assez bien. Par exemple, au lieu d'appliquer une force pour
Rigidbody.velocity
déplacer votre personnage, vous pourriez jouer directement avecTransform.Translate()
, ce qui déplace l'objet enTransform.position
fonction de son axe. Vous pouvez déterminer leforward
etback
lié à l'objet lui-même ou peut-être à la plate-forme ou au solTransform.up
, donc vous saurez si c'est une rampe et en quelque sorte connaître son angle.De plus, si vous créez une sorte d'attribut de contrôle de la vitesse (par exemple, combien de temps la touche est enfoncée), vous pouvez l'appliquer avec votre direction pendant la traduction pour empêcher votre personnage de marcher quelque chose de trop incliné sans une certaine vitesse, tout comme ils l'ont fait sur Sonic the Hedgehog pour Genesis / Mega Drive.
Si vous choisissez de continuer à utiliser la physique, je ne peux pas vous aider du tout parce que je ne suis pas si bon dans ce domaine, mais sachez que c'est un comportement normal de monter une pente plus lentement car le corps a besoin de plus de force pour suivre , comme la vraie vie.
la source
Ce que vous voulez, c'est le contrôleur de caractères intégré . En définissant la
step offset
propriété sur ce composant, vous pouvez demander à un joueur de monter et descendre des pentes avec facilité.la source
Je suppose que c'est parce que la force n'est pas parallèle à la plate-forme et le résultat finit par être plus faible en montée et plus en descente.
Si vous appliquez une force relative au système de coordonnées
Vous voulez garder une vitesse maximale en "x" et la comparer à un scalaire, rappelez-vous que la vitesse est un vecteur et composez vx et vy, en terrain plat, vy est nul, mais nécessairement sur les pentes est supérieur à zéro.
La vitesse change selon la direction du corps, et sa vx relative change par rapport à sa vx globale
Cela peut modifier votre V d'une manière que vous ne voulez pas trop:
le maintien du même Vx global peut sembler étrange à l'œil nu. (Accélérations indésirables)
la source