我正在尝试制作一个游戏,你可以在 0 重力空间的小行星之间跳跃。我希望我的玩家能够粘在小行星上并能够沿着它的表面行走,直到他跳走。
我能够创建一些检查表面的东西,如果脚接地,我会从玩家向表面施加力,但在锋利的边缘或如果我走得太快,我的检查可能会失败并且我的玩家被推开。
我需要被抓伤,直到我决定不这样做为止。
我当前的代码:
private void CheckGrounded()
{
// Perform a raycast to check for ground, ignoring trigger colliders
RaycastHit2D hit = Physics2D.Raycast(feetPosition.position, -transform.up, feetDistanceCheck, groundLayer);
if (hit)
{
// Align the player's rotation with the surface normal
surfaceNormal = hit.normal;
float angle = Mathf.Atan2(surfaceNormal.y, surfaceNormal.x) * Mathf.Rad2Deg - 90f;
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(0, 0, angle), 0.1f);
rb.freezeRotation = true;
isGrounded = true;
// Apply surface attachment if not jumping
if (jumpTimer <= 0)
ApplySurfaceAttachment();
}
else
{
isGrounded = false;
rb.freezeRotation = false;
}
}
private void ApplySurfaceAttachment()
{
Vector2 force = surfaceNormal * -surfaceTension;
rb.AddForce(force);
}
实际要保持的良好行为:你可以选择慢慢走到一个地方,停下来,直跳。或者通过快速行走和跳跃来进行速跑,以保持动力,同时不刮伤表面。
为了获得您想要的行为,您应该在玩家进入一定距离时向小行星中心添加重力,并具有较高的跳跃速度,以便玩家能够距离小行星足够远。这将导致玩家即使失去联系,仍然会被小行星吸引,除非他们距离足够远。可以调整力的大小和最大距离,以便玩家只有在跳跃时才会离开小行星。