Unity 2d游戏运动脚本问题-无法跳转

时间:2018-09-16 17:06:56

标签: c# unity3d

因此,基本上,经过数小时的折磨,我尝试为简单的平台游戏创建基本的动作脚本,但还是成功了。方形字符可以移动并可以正常跳跃,但有时它不会跳跃,通常是在短距离内移动,或者很少站立并试图跳跃。我不知道该如何解决。这是整个脚本:

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;
    }
}

}

它可能并不那么重要,但是我想尽可能地完善该游戏,即使我不需要,因为它基本上是我用C#在Unity3d中制作的第一款游戏。

2 个答案:

答案 0 :(得分:0)

这是因为您的跳转逻辑位于 FixedUpdate()

当您使用 GetKeyDown 注册输入时,请确保使用Update代替,因为如果您使用 FixedUpdate 按下该键,则该帧可能会在该帧中运行,也可能不会运行,请对其进行测试而是使用更新。

您已经在注释中说明了Update的工作原理,它被称为每一帧,但根据Unity documentation则为FixedUpdate:此函数被称为每个固定帧速率帧

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");
    }
}

答案 1 :(得分:0)

要记住的重要事项:Unity3D Engine的输入仅在引擎为您的GameObjects调用Update()方法时更新。

这意味着您不应阅读FixedUpdate()方法中的任何类型的输入。在FixedUpdate()期间,不应调用GetKeyDown()之类的方法以及其他来自Input类的方法,这些方法读取键盘/鼠标/轴按钮/值,因为它们的返回值不可靠。

由于此,可能导致跳转实现失败的原因是,当您在FixedUpdate()中调用的GetKeyDown()方法返回不一致/无效(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) */
    }
}