(这是一个2D项目)
我有一个跳跃的问题,如果我的角色走进X平台,她就不会跳,但当她跳到X平台时,她可以跳跃。
对于平台我目前正在使用2个Box Collider 2D(一个带有"触发"已检查)
对于角色我目前正在使用2个Box Collider 2D(一个带有"触发"检查)和Rigidbody 2D。
下面是我正在尝试使用的跳跃和接地的代码。
{
public float Speed;
public float Jump;
bool grounded = false;
void Start()
{
}
void Update()
{
if (Input.GetKeyDown(KeyCode.UpArrow))
{
if (grounded)
{
GetComponent<Rigidbody2D>().velocity = new Vector2(GetComponent<Rigidbody2D>().velocity.x, Jump);
}
}
}
void OnTriggerEnter2D()
{
grounded = true;
}
void OnTriggerExit2D()
{
grounded = false;
}
}
问题出现在每个平台的同一部分。 (每个方块代表一个平台精灵,它们具有完全相同的特征,因为我复制粘贴其中的每一个)。请查看此链接上的照片:https://imgur.com/a/vTmHw
答案 0 :(得分:3)
之所以发生这种情况,是因为你的方块有单独的碰撞器。想象一下:
有两个区块:A
和B
。你站在A
区块。现在,您尝试在B
区块上行走。只要您的Rigidbody2D
碰撞器碰到阻止B
,您的角色就会获得一个事件OnTriggerEnter2D(...)
。现在你声称,你已经停飞了
但是,此时您仍然与块A
发生碰撞。只要Rigidbody2D
不再与阻止A
发生碰撞,您的角色就会收到OnTriggerExit2D(...)
。现在你声称,你不再是基础了。但事实上,你仍然在与B
块碰撞。
您可以拥有名为bool
的{{1}}类型变量,而不是使用byte
变量进行检查:
做一些检查以确保你实际上在对撞机上方!
现在,一旦你需要检查你的角色是否接地,你可以使用
collisionsCounter
实际上,在进一步投入问题之后,我意识到你有完全不必要的对手(我说的是触发器)。删除那些。现在每个对象只有一个碰撞器。但要获得碰撞请求,您需要更改:
if (collisionsCounter > 0)
{
// I am grounded, allow me to jump
}
至OnTriggerEnter2D(...)
OnCollisionEnter2D(Collision2D)
至OnTriggerExit2D(...)
OnCollisionExit2D(Collision2D)
这里可能是小错别字,因为所有代码都是在记事本中输入的......
答案 1 :(得分:2)
我认为这里有几个问题。
首先,使用Triggers
来检查这种类型的碰撞可能不是最好的方法。我建议不使用触发器,而是使用OnCollisionEnter2D()
。 Triggers
只检测两个物体的碰撞空间是否相互重叠,而正常碰撞碰撞每个物体,就像它们是两个固体物体一样。看起来好像你正在探测你是否已经降落在地板上,你不想像Triggers
那样摔倒地板。
其次,我建议使用AddForce
代替GetComponent<Rigidbody2D>().velocity
。
您的最终脚本可能如下所示:
public class PlayerController : MonoBehaviour
{
public float jumpForce = 10.0f;
public bool isGrounded;
Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void OnCollisionEnter2D(Collision2D other)
{
// If we have collided with the platform
if (other.gameObject.tag == "YourPlatformTag")
{
// Then we must be on the ground
isGrounded = true;
}
}
void Update()
{
// If we press space and we are on the ground
if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
// Add some force to our Rigidbody
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
// We have jumped, we are no longer on the ground
isGrounded = false;
}
}
}