Как я могу получить это, чтобы мой персонаж не прыгал бесконечно? - PullRequest
0 голосов
/ 06 февраля 2020

Это код, который я написал до сих пор, который позволяет игроку, которому управляет персонаж, быть в состоянии прыгать постоянно, я только хочу, чтобы они могли прыгать только на земле.

void Update()
    {
        this.transform.Translate(Input.GetAxis("Horizontal"), 0, 0);
        xdirectionMovement = Input.GetAxis("Horizontal") * runspeed; //GetAxisRaw("Horizontal") 

        if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space))  //makes player jump
        {
            GetComponent<Rigidbody2D>().AddForce(jumpdistance, ForceMode2D.Impulse);

Ответы [ 2 ]

0 голосов
/ 08 февраля 2020

Добавьте bool, чтобы проверить, заземлен ли игрок, добавьте Векторы и Коллайдеры, чтобы определить, где находится игрок, относительно земли.

private BoxCollider2D box;
Vector3 maxValue= box.bounds.max;
Vector3 minValue=box.bounds.minValue;
Vector2 x = new Vector2(max.x, minValue.y -0.1f);
Vector2 y = new Vector2(minValue.x, minValue.y - 0.1f);
Collider2D ground = Physics.OverlapArea(x,y);
bool jump = false;
if (ground != null)
{
    jump = true;
}

Наконец, вы можете добавить bool к своему входу, например,

if (Input.GetKeyDown(KeyCode.Space) && jump == true)
{
    //player jump 
}
0 голосов
/ 06 февраля 2020

Убедитесь, что вы разрешаете прыгать только тогда, когда персонаж заземлен. Один из подходов к проверке этого заключается в использовании нисходящей лучевой трансляции и проверке, находится ли попадание ниже определенного порога:

void Update()
{
    print(IsGrounded());
}

bool IsGrounded()
{
    const float distanceToGround = 1f;
    return Physics.Raycast(
        transform.position, -Vector3.up, distanceToGround) != null;
}

Другой способ - использовать компонент CharacterController и проверить его bool:

CharacterController controller = null;

void Start()
{
    controller = GetComponent<CharacterController>();
}

void Update()
{
    print(controller.isGrounded);
}

Другой способ - прослушать событие столкновения и установить значение bool:

bool collides = false;

void FixedUpdate()
{
    print(collides);

    collides = false;
}

void OnCollisionStay(Collision collision)
{
    collides = true;
}

Обратите внимание, что иногда полезно использовать юзабилити, чтобы дать немного свободы действий, чтобы пользователь мог прыгать, даже если он упал на землю. на несколько пикселей, или пропустите время на несколько миллисекунд. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...