Unity2D:如何使用光线投射控制器实现正确的爬梯?

时间:2018-01-15 05:57:28

标签: c# unity3d collision-detection raycasting

我一直在减慢我的角色控制器的编程功能,最后要实现的是爬梯。我在过去两天提出的代码大部分都有效,但提出了一些问题:

  1. 有时角色在攀爬时按住向上箭头,在单向平台与梯子末端相交的位置处反弹。
  2. 一旦角色一直向上,在单向平台上休息,它就不能再回落了。这可以通过更长的梯子对撞机来解决,但这会使问题#1变得更糟。
  3. 如果角色在梯子附近的地面上并且跳跃,但是在最后一秒按下向上箭头,它会在某个方向上被甩得相当远。
  4. 如果角色在绳子上并从绳子上跳下来,但是在这样做之前保持向上箭头,它会略高,但是很明显。没有按住向上箭头,而只是按下向左或向右箭头并跳跃,产生一个有规律的跳跃。也许这与x或y输入轴有关?
  5. 我的类的工作方式是我有一个Controller2D类来处理大部分的光线投射和移动方法,一个用于调用移动方法的输入的Player类,以及一个用于设置默认世界参数的参数类,如gravity和跳跃高度,但如果角色在某个体积中,例如水或梯子对撞机,则可以被覆盖(这允许我在攀爬时将重力设置为0,这样角色可以正常移动)。几乎所有的梯形图代码都包含在OnTriggerEnter / Stay / Exit函数中,我不确定这是否是最好的方法。

    我尝试制作ClimbUp / ClimbDown方法,并从播放器中心拍摄光线投影,这样可以让他或她爬起来,但这并不是太成功(与使用OnTriggerStay相比,存在太多问题)

    我想知道在光线投射控制器中成功实施爬梯的人,或者任何可能有建议的人,都愿意指出我正确的方向完成这项任务。

    这是一些剧本:

    public void ClimbLadder(float y)
    {
        ClimbingOnLadder = true;
        SetVerticalForce(y);
    }
    
    public void JumpWhileClimbing(float x)
    {
        if (ClimbingOnLadder)
        {
            ClimbingOnLadder = false;
            overrideParameters = null;
            AddForce(new Vector3(x, Parameters.jumpVelocity * .70f, 0));
            JumpAfterClimbing = true;
            print(Parameters.jumpVelocity);
        }
    }
    
    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.tag == "Ladder")
        {
            CanClimb = true;
        }
    }
    
    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.tag == "Ladder")
        {
            if (ClimbingOnLadder)
            {
                var newParameters = other.gameObject.GetComponent<ControllerPhysicsVolume2D>();
    
                if (newParameters == null)
                {
                    return;
                }
    
                overrideParameters = newParameters.NewParameters;
                Debug.Log("overriding");
    
                if (ClimbingOnLadder && State.IsCollidingBelow)
                {
                    ClimbingOnLadder = false;
                    overrideParameters = null;
                }
            }
        }
    }
    
    private void OnTriggerExit2D(Collider2D other)
    {
        if (other.tag == "Ladder")
        {
            CanClimb = false;
            ClimbingOnLadder = false;
            JumpAfterClimbing = false;
        }
    
        var newParameters = other.gameObject.GetComponent<ControllerPhysicsVolume2D>();
    
        if (newParameters == null)
        {
            return;
        }
    
        overrideParameters = null;
    }
    

0 个答案:

没有答案