我在Unity中创建了一个函数,它应该允许角色攀爬。它产生了两个问题,首先它以某种方式与一般的移动函数交互。当角色开始跑动时,即使玩家没有移动他们,他们的动画也不会停止。其次,角色可以爬上爬下的梯子,但不会从梯子上下来,尽管技术上的逻辑是这样构建的,他们应该回到他们的正常状态。
我已经尝试过关闭Update()函数中的攀爬函数,所以我知道运行问题是由它引起的,因为没有它就能正常工作。
private void Climb()
{
RaycastHit2D ladder = Physics2D.Raycast(transform.position, Vector2.up, 5, whatIsLadder);
float hDirection = Input.GetAxisRaw("Horizontal");
float vDirection = Input.GetAxisRaw("Vertical");
if (ladder.collider != null)
{
if (vDirection > 0.1f)
{
isClimbing = true;
}
}
else
{
if (hDirection > 0.1f)
{
isClimbing = false;
}
}
if (isClimbing == true && ladder.collider != null)
{
rb.gravityScale = 0;
rb.velocity = new Vector2(rb.velocity.x, climbSpeed * vDirection);
if (Mathf.Abs(vDirection) > 0.1f)
{
anim.speed = 1f;
}
else
{
anim.speed = 0f;
}
}
else
{
rb.gravityScale = naturalGravity;
}
}
我还会给出整个PlayerController脚本的链接,因为这可能会帮助一些人。https:/github.comPacal2PlatformerbmasterAssetsScriptsPlayerController.cs。
试着在刚体停止攀爬时重置他的速度,在函数的结尾处。
//....
{
rb.gravityScale = naturalGravity;
}
进入:
{
rb.gravityScale = naturalGravity;
rb.velocity = new Vector2(0.0f, 0.0f);
}
这段代码看起来也很可疑
if (ladder.collider != null)
{
if (vDirection > 0.1f)
{
isClimbing = true;
}
}
else
{
if (hDirection > 0.1f)
{
isClimbing = false;
}
}
改为:
if (ladder.collider != null)
{
if (vDirection > 0.1f || vDirection < -0.1f) //if allowed to climb down
{
isClimbing = true;
}
if (hDirection > 0.1f || hDirection < -0.1f) //moving left
{
isClimbing = false;
}
}
试试动画的速度。
anim.speed = rb.velocity.x;