如何为2D Platformer创建阶梯?

时间:2019-01-04 18:54:44

标签: unity3d 2d game-development

我们正在做一个简单的2D平台游戏,上楼梯._遇到困难。底线是角色必须爬上梯子才能站立在梯子上,并通过按下向下箭头下降。为此,我们在平台与梯子最高点接触的平台上使用PlatformEffector2D,并编写了一个脚本,当角色接触平台本身的对撞机时,脚本应更改rotationalOffset,具体取决于当前值(0或0)。 180)和夹紧键(向上或向下)。这是代码:

    private void OnCollisionStay2D(Collision2D col)
      {
        if (col.gameObject.name == "platform_ladder")
      {
        PlatformEffector2D pe = 
    col.gameObject.GetComponent<PlatformEffector2D>();
        if (Input.GetKeyDown(KeyCode.DownArrow) && pe.rotationalOffset == 
      0)
        {
            pe.rotationalOffset = 180;
        }
        else if (Input.GetKeyDown(KeyCode.UpArrow) && pe.rotationalOffset 
       == 180)
          {
            pe.rotationalOffset = 0;
          }
        }
     }

结果,角色爬上楼梯,站立在楼梯上,但对按下按键没有反应。如果您退后一步来赚钱,那么脚本将起作用,并且轮换偏移也会发生变化。但是,不可能站在平台上,角色只是从那里爬过去。我举了一个从屏幕上录制的示例(不幸的是,它减慢了视频的速度,但是我在视频上写的内容是可见的)

https://drive.google.com/file/d/1ccUi0sqtVxFS1UAKE7QaQKvr3x4-7S8o

无论如何,我都会给出爬楼梯的代码;突然有一个错误:

   /* CLimbing */

    raydistance = 0;
    RaycastHit2D hitinfo = Physics2D.Raycast(transform.position, Vector2.up, raydistance, whatisLadder);

    if (hitinfo.collider != null)
    {

        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            isClimbing = true;

        }
        else if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.LeftArrow))
        {
            isClimbing = false;
        }

    }
    else
    {
        isClimbing = false;
    }

    anim.SetBool("OnLadder", isClimbing);

    if (isClimbing && hitinfo.collider != null)
    {
        rb.velocity = new Vector2(rb.position.x, Input.GetAxisRaw("Vertical") * speed);
        // rb.gravityScale = 0;
        rb.isKinematic = true;
        anim.SetBool("Ground", true);
    else
    {
        rb.isKinematic = false;
        // rb.gravityScale = 3;
    }

我们不要求编写解决方案代码,但请您向我们解释该原理并向正确的方向发送它,谢谢^^

1 个答案:

答案 0 :(得分:0)

也许在角色和梯子游戏对象上添加触发对撞机,并在按住并触发时增加玩家的y位置?

private Rigidbody rb;
[SerializeField]
private float ClimbingSpeed;

void Start(){
rb = GetComponent<Rigidbody>();
}

Public void OnTriggerStay(Collider collider){
 if(collider.gameobject.tag == "Ladder" && input.GetKey(KeyCode.W)){
     rb.moveposition(
  transform.position.x, 
  transform.position.y + 1 * Time.DeltaTime * ClimbingSpeed, 
  transform.position.z
{
{