#unity3d #game-physics
#unity3d #игра-физика
Вопрос:
Я могу заставить свой спрайт прыгать с помощью оси.RawInput. Этот ввод также служит параметром для запуска анимации прыжков, когда значение RawInput больше 0. Проблема с этим заключается в том, что когда вы отпускаете клавишу, спрайт мгновенно падает обратно. Как я могу выполнить фиксированный прыжок, когда клавиша нажата один раз или удерживается нажатой, а затем спрайт падает с фиксированной скоростью, при этом также запускается анимация?
Это то, что у меня есть в моем скрипте PlayerMover сейчас.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMover : MonoBehaviour
{
public Animator anim;
public Vector3 velocity = Vector3.zero;
public float runSpeed = 0f;
public float jumpSpeed = 0f;
private SpriteRenderer sp;
public float maxJump = 4f;
private void Awake()
{
sp = GetComponent<SpriteRenderer>();
}
void Update()
{
runSpeed = Input.GetAxisRaw("Horizontal");
jumpSpeed = Input.GetAxisRaw("Vertical");
anim.SetFloat("Jump", jumpSpeed);
anim.SetFloat("Speed", Mathf.Abs(runSpeed));
}
private void FixedUpdate()
{
Move(runSpeed, jumpSpeed*4);
}
void Move(float horizontal, float vertical)
{
if(horizontal > 0 || horizontal > 0 amp;amp; vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = false;
}
else if(horizontal < 0 || horizontal <0 amp;amp; vertical >0)
{
anim.SetBool("Idle", false);
sp.flipX = true;
}
else
anim.SetBool("Idle", true);
velocity.x = horizontal;
velocity.y = vertical;
transform.position = velocity * Time.fixedDeltaTime;
}
}
Я читал об использовании чего-то вроде
if(Input.GetKeyDown(GetKeyCode("Space"){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
Для перемещения, но это позволяет совершать дополнительные прыжки при нажатии пробела.
Ответ №1:
Если вы хотите использовать что-то вроде:
if(Input.GetKeyDown(GetKeyCode("Space"))){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
но нужно запретить игроку прыгать, когда он уже в воздухе, просто разрешайте им делать это только тогда, когда они уже на полу. Итак:
if(Input.GetKeyDown(GetKeyCode("Space")) amp;amp; isOnFloor()){
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
Где isOnFloor()
есть какая-то функция, которая проверяет, находится ли ваш персонаж на полу. В зависимости от вашей игровой реализации это можно сделать несколькими способами, но наиболее распространенным является проверка, сталкивается ли персонаж игрока с чем-либо, и если да, то находится ли этот объект столкновения под ними. В этом потоке stackexchange приведены некоторые примеры кода для достижения этой цели.
Комментарии:
1. По-прежнему ли addforce управляет горизонтальным перемещением игроков? Могу ли я использовать это вместо своего преобразования.позиции = скорость * Время. Исправлена задержка?
2. Вы можете сделать это таким образом, но я, вероятно, не рекомендовал бы этого, потому что вместо применения постоянной дельты это больше похоже на горизонтальную стрельбу по вашему персонажу из пистолета. С вертикальными силами гравитация противодействует этому так же, как в реальной жизни, но по горизонтали это не совсем то же самое, как то, как персонажи ходят в играх.
Ответ №2:
Для того, чтобы использовать это
if (Input.GetKeyDown(GetKeyCode("Space"))
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
}
вам нужно проверить, сталкивается ли ваш плеер с землей, поэтому вместо этого у вас будет bool типа bool isGrounded
, чтобы проверить, касаетесь ли вы земли, для этого вы можете сделать это в OnCollisionStay()
, чтобы подтвердить, что это правда, когда вы сталкиваетесь с землей. Вы можете использовать теги, чтобы проверить, является ли коллайдер, с которым вы сталкиваетесь, землей. Затем, когда вы прыгаете, вам нужно сказать, isGrounded = false;
тогда это не будет правдой, пока вы снова не приземлитесь на землю
if (Input.GetKeyDown(GetKeyCode("Space") amp;amp; isGrounded == true)
{
rigidbody2D.AddForce(new Vector2(0, 10), ForceMode2D.Impulse);
isGrounded = false;
}