Прыгайте только один раз, пока персонаж не приземлится - PullRequest
0 голосов
/ 11 июня 2018

Я только начал использовать Unity, пытаясь сделать простой 3D-платформер, прежде чем я смогу это сделать, мне нужно снизить скорость.Моя проблема возникает, когда игрок прыгает.Когда они прыгают, они могут прыгать в воздухе столько, сколько хотят.Я хочу, чтобы он прыгнул только один раз.Кто-нибудь может помочь?

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

public class Playermovement : MonoBehaviour 
{
    public Rigidbody rb;

    void Start ()   
    }

        void Update()
        {
            bool player_jump = Input.GetButtonDown("DefaultJump");
            if (player_jump)
            {
                rb.AddForce(Vector3.up * 365f);
            }
        }
    }
}

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать флаг, чтобы определить, когда игрок касается земли, и только прыгать, когда игрок касается пола.Это может быть установлено на true и false в функциях OnCollisionEnter и OnCollisionExit.

Создайте тег с именем «Ground» и заставьте GameObjects использовать этот тег, затем присоедините модифицированный код ниже кигрок, который делает прыжки.

private Rigidbody rb;
bool isGrounded = true;
public float jumpForce = 20f;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

private void Update()
{
    bool player_jump = Input.GetButtonDown("DefaultJump");

    if (player_jump && isGrounded)
    {
        rb.AddForce(Vector3.up * jumpForce);
    }
}

void OnCollisionEnter(Collision collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = true;
    }
}


void OnCollisionExit(Collision collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isGrounded = false;
    }
}

Иногда использование OnCollisionEnter и OnCollisionExit может быть недостаточно быстрым.Это редко, но возможно.Если вы столкнетесь с этим, используйте Raycast с Physics.Raycast для определения пола.Удостоверьтесь, что луч выброшен только на слой «Земля».

private Rigidbody rb;
public float jumpForce = 20f;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

private void Update()
{
    bool player_jump = Input.GetButtonDown("DefaultJump");

    if (player_jump && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce);
    }
}

bool IsGrounded()
{
    RaycastHit hit;
    float raycastDistance = 10;
    //Raycast to to the floor objects only
    int mask = 1 << LayerMask.NameToLayer("Ground");

    //Raycast downwards
    if (Physics.Raycast(transform.position, Vector3.down, out hit,
        raycastDistance, mask))
    {
        return true;
    }
    return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...