Проблема скрипта движения в Unity 2d - невозможно прыгнуть - PullRequest
0 голосов
/ 16 сентября 2018

Так что, в основном, после нескольких часов мучений, пытаясь создать базовый скрипт движения для простой платформерной игры, мне это удалось, но не совсем.Квадратный персонаж может двигаться и прыгать нормально, но иногда он не прыгает, обычно при движении на короткие расстояния или, редко, на месте и пытается прыгнуть.Я не могу понять, как это исправить.Вот весь сценарий:

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

public class PlayerMovement : MonoBehaviour {

private Rigidbody2D rgdb2;
public float movementSpeed;
public float jumpHeight;
private bool isJumping = false;



// Use this for initialization
void Start ()
{
    rgdb2 = GetComponent<Rigidbody2D>();    
}

// Update is called once per frame
void FixedUpdate ()
{
    float moveHorizontal = Input.GetAxis("Horizontal");

    HandleMovement(moveHorizontal);

    if (Input.GetKeyDown(KeyCode.Space) && isJumping == false)//by typing Space player jumps, cant double-jump
    {
        rgdb2.AddForce(new Vector2(rgdb2.velocity.x, 1 * jumpHeight), ForceMode2D.Impulse);

        isJumping = true;

        Debug.Log("jumped");
    }
}

private void HandleMovement(float moveHorizontal)//applying player horizontal controls and customing player's speed by movementSpeed variable
{
    rgdb2.velocity = new Vector2(moveHorizontal * movementSpeed, rgdb2.velocity.y); 
}

private void OnCollisionEnter2D(Collision2D coll)
{
    if (coll.transform.tag == "Platform") //if player is touching object with Platform tag, he can jump
    {
        Debug.Log("on ground bitch");
        isJumping = false;
    }
}

}

Возможно, это не так уж важно, но я хочу оттачивать эту игру настолько, насколько это возможно, даже если мне не нужно, так какв основном это моя первая игра, созданная в Unity3d с C #.

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Важно помнить: входные данные движка Unity3D обновляются только в то время, когда движок вызывает Update() методы для ваших GameObjects.

Это означает, что вы не должны читать любой тип ввода в методе FixedUpdate(). Такие методы, как GetKeyDown () и другие методы из класса Input, которые читают кнопки / значения клавиатуры / мыши / оси, не должны вызываться во время FixedUpdate(), поскольку их возвращаемые значения ненадежны.

В связи с этим, вероятно, причиной сбоя реализации прыжка является то, что метод GetKeyDown () , который вы вызываете в FixedUpdate(), возвращает несогласованные / недействительные (false) результаты, когда пользователь нажимает клавишу прыжка.

Исправить это может быть довольно просто. Я предлагаю вам сохранить логическую переменную, которая отслеживает, была ли нажата клавиша перехода, и обновляет ее значение во время Update(). Это должно исправить вашу проблему.

bool jumpKeyPressed;

private void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
        jumpKeyPressed = true;
    else if (Input.GetKeyUp(KeyCode.Space))
        jumpKeyPressed = false;
}

private void FixedUpdate()
{
    /* Update "moveHorizontal", call HandleMovement(...) here, as you've already done. */

    if (jumpKeyPressed && isJumping == false)
    {
        // IMPORTANT: this prevents the "jump force" from being applied multiple times, while the user holds the Space key
        jumpKeyPressed = false;

        /* Remaining jumping logic goes here (AddForce, set "isJumping", etc) */
    }
}
0 голосов
/ 16 сентября 2018

Это потому, что ваша логика для прыжка находится внутри FixedUpdate ()

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

У вас уже есть в комментариях, как работает Update, он вызывается каждый кадр, но FixedUpdate согласно Документация Unity : Эта функция вызывается каждый fixed framerate frame

void Update ()
{
    float moveHorizontal = Input.GetAxis("Horizontal");

    HandleMovement(moveHorizontal);

    if (Input.GetKeyDown(KeyCode.Space) && isJumping == false)//by typing Space player jumps, cant double-jump
    {
        rgdb2.AddForce(new Vector2(rgdb2.velocity.x, 1 * jumpHeight), ForceMode2D.Impulse);

        isJumping = true;

        Debug.Log("jumped");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...