我刚开始学习如何做一个简单的2D平台游戏的游戏在团结,我看过Blackthornprod 2D Platformer movement video,了解如何使一个角色移动和跳跃。到目前为止,我能够理解大部分的视频,但是,我也遇到了一些问题与跳跃的部分。
现在,据我从他的视频中了解,要使角色跳起来,我需要检测角色是否在地面上。为此,我需要在玩家脚下创建一个小圆圈,看看它是否与地面重叠,like this
所以,在这里是代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float JumpForce; // jumping force
private bool isGrounded; //if the player is touching the ground
public Transform GroundCheck; //object that contains the position of the
//"circle"
public LayerMask GroundLayer; //the layer that the "circle" collide with
public float radius; //radius of the circle
public float BaseNumOfJumps; //maximum number of jumps
private float NumOfJumps; //current number of jumps
private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
NumOfJumps = BaseNumOfJumps;
}
void FixedUpdate()
{
//check the collision between the "circle" and the ground
isGrounded = Physics2D.OverlapCircle(GroundCheck.position,
radius,GroundLayer);
//here is the horizontal movement update part, but they are
//irrelevant so I cut them off
}
void Update()
{
//if the player touches the ground, reset the number of jumps
if (isGrounded)
{
NumOfJumps = BaseNumOfJumps;
}
//when jumping, decrease the number of jumps
if (Input.GetKeyDown(KeyCode.UpArrow) && NumOfJumps > 0)
{
rb.velocity = Vector2.up * JumpForce;
NumOfJumps--;
}
}
}
下面就是问题的开始,跳跃的实际最大数总是比我中输入的值。因此,例如,如果我把BaseNumOfJumps = 2,那么我可以跳3倍而不是2,同样地,如果BaseNumOfJumps = 1,则我可以跳2倍等。
过了一会儿,我发现因为圆的大小始终是一个稍微有点比实际的球员的脚大,当我跳的是介于两者之间,球员的脚为int的空气了一下,但圈仍然与地面,其中重置跳跃的当前数量(又名NumOfJumps在我的代码),使我的性格能够做一个比BaseNumOfJumps输入的号码多跳重叠。 我不知道这是否正确,but here was what I imagined。 This comment under the video also described the same problem.
虽然Blackthornprod已经提到的值作为“额外的跳跃”,所以如果我在那个值,输入“1”,我会跳两次,“2”,我会跳3次,等我仍然遇到了在制造一些困难跳跃次数保持一致。如果我的角色只是滑出地面而不跳like this怎么办?圆不会碰撞地面,我就能跳我BaseNumOfJumps进入跳跃的确切数量,简称:
如果我输入的最大跳数为2,我将能够(再次,这只是我的猜测,所以我可能是错的):
哪些当然创建一些不一致性。我搜索了其他有关跳跃和碰撞的教程,但是其中大多数都使用其他形式的碰撞检查(例如OnCollisionStay,OnCollisionEnter)或使用与我相同的方法,但并没有深入解释它(所以基本上它们是相同的如在Blackthornprod的视频)
那么,如何解决这个问题,我怎样才能改变“圈”,使其离开地面同一时刻玩家的脚叶,当他们跳的半径?还是应该使用我之前提到的其他形式的冲突检查,如果是的话,它们之间的区别是什么,哪个最有效?
这是我的第一个问题在这里,我知道这是一个有点长和困惑,因为我不熟悉英语,但我会很感激,如果有人可以提供帮助。
答案 0 :(得分:0)
让我们对我们想做的事情有一个概念上的理解。我们希望玩家具有相同的跳跃次数,而不管他们是先跳跃(使用一次跳跃)还是摔倒(不使用一次跳跃)。但是,可以确定一个简单的事实:如果我们不在地面上,则不能使用我们的地面跳跃。我们可以通过分别跟踪地面跳跃和空中跳跃来实现这一目标。
现在,仅我们需要问允许使用一个接地跳的问题是玩家是否是在地面上。我们需要问允许使用奖金跳跃的唯一问题是玩家是否是在空气中和玩家是否已经离开跳
所有剩下的就是确定玩家是否已经跳跃离开。如果他们摔倒了,我们只能算出他们获得的总跳数中有多少跳。如果他们跳了,我们可以算出他们跳的总数中有多少跳减去一。
的此考虑所有给我们的以下逻辑:
int numberOfJumps = 1; //Or however many you want.
boolean initiallyJumped = false;
//Other stuff
void Update()
{
//Reset jumps BEFORE considering allowing jumps
if(isGrounded)
{
initiallyJumped = false;
resetJumpCounter();
}
if(Input.GetKeyDown(KeyCode.UpArrow))
{
if(!initiallyJumped && isGrounded)
{
jump();
initallyJumped = true;
}
else
{
int jumpsRemaining = numberOfJumps;
if(initiallyJumped)
{
jumpsRemaining--;
}
if(numberOfJumps > jumpsRemaining)
{
jump();
numberOfJumps--;
}
}
}
}
现在,最初的跳只有当还没有使用过它使用与玩家在地面上。奖金跳跃在任何其他情况下使用。但是,如果我们最初进行跳跃,则奖励跳跃的次数将减少一。