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