我的 rb2d 重力比例设置为 0,但当我按下梯子上的向下箭头时我仍然摔倒

问题描述

我正在为我的 Unity 游戏制作梯子。当您将鼠标悬停在它上面时,没有任何反应(这是正常的)。我想通过在按下向上箭头键(或 w)时将gravityscale 设置为 0 来冻结重力。谢天谢地,这有效。不幸的是,尽管每当我下降时,重力仍然为 0,但不知何故我的角色会落回地面。

这是我的播放器代码。抱歉,格式很糟糕;我只是删除了与梯子无关的内容,以免您阅读不相关的细节。

 // ladder
    public float climb;
    public float climbspeed;
    public float gravitystore;
    public bool laddered;
    public GameObject laddercheck;
    public float upaxis;
    public xpositionladdercheck ladderx;


    // Start is called before the first frame update
    void Start()
    {
        ladderx = FindobjectOfType<xpositionladdercheck>();
        jumptimecounter = Jumptime;
        jumpscriptbetter = FindobjectOfType<BetterJump>();
       
        gameover = false;
        respawnscreen = FindobjectOfType<RespawnIntermission>();
        lives = 5;
        atkindex = FindobjectOfType<attackindex>();
        scale =transform.localScale;
        basicattackscript = FindobjectOfType<BasicAttack>();
        basicattacksupply = 0;
        rb = GetComponent<Rigidbody2D>();
        gravitystore = rb.gravityScale;

    }

    // Update is called once per frame
    private void Update()
    {
     

        
     
        
        horimove = Input.GetAxis("Horizontal");
       
        
       
        if (isDead == false)
        {
            upaxis = Input.GetAxis("Vertical");
            anim.SetFloat("run",Mathf.Abs(horimove));
            if (Input.GetKeyDown(KeyCode.Space) && laddered)
            {
                jumpladder();
            }
            anim.SetFloat("run",Mathf.Abs(horimove));
            if (laddered && Mathf.Abs(upaxis) > .01)
            {
                rb.gravityScale = 0;
                climbm();
            } else if (!laddered)
            {
                rb.gravityScale = gravitystore;
            }
         if (laddered&&Input.GetKeyDown(KeyCode.Space))
            {
                StartCoroutine("jumpable");

            }  
           
            
        rb.veLocity = new Vector2(speed * horimove * Time.fixedDeltaTime,rb.veLocity.y);
            if (Input.GetKey(KeyCode.Space) && OnGround)
            {
                jump();
            }
        }


    }
    IEnumerator jumpable()
    {
      
        laddercheck.SetActive(false);
        yield return new WaitForSeconds(.8f);
        laddercheck.SetActive(true);

    }
    void climbm()
    {
        if (laddered)
        {
            if (upaxis > .1f) {
               

            } else if (!laddered)
            {
                rb.constraints = RigidbodyConstraints2D.FreezeRotation;
            }
            rb.veLocity = Vector2.up * climbspeed * upaxis *Time.deltaTime;
            transform.position = new Vector2(ladderx.ladderxpos,rb.position.y);
// the ladder.x things is just a script that gets the x position of the ladder but it works well so ignore that.
            

        }
    }
    public void jump()
    {
        
        
       
           
        
   
    }public void jumpladder()
    {
        
        
       
           
        
        if (Input.GetKeyDown(KeyCode.Space))
        {

                rb.AddForce(Vector2.up * jumpforce * Time.fixedDeltaTime);
               
              

            
        }
       
    }
            
    }
   
    }

我将质量设置为最低 (.0001),但仍然发生同样的事情。我没有包括天梯位置脚本或我什至在天梯脚本上的感觉,但这与问题无关。它感觉一切都很好,xposition 脚本也运行良好。

解决方法

我想通了。出于某种原因,我不得不将 Physics2D.gravity 设置为新的 Vector2 (0,0);每当我爬梯子。然后我创建了一个向量 2 phygravity 变量,用于存储自然重力,并在我离开梯子时将其设置回原来的值。

physgravity = Physics2D.gravity;
        Physics2D.gravity = new Vector2(0f,-9.81f);
 private void Update()
    {
        if (!laddered)
        {
            Physics2D.gravity = new Vector2(0f,-9.81f);
        }
____________________ (later on in the script)
 if (laddered && Mathf.Abs(upaxis) > .01)
            {
                rb.gravityScale = 0;
                Physics2D.gravity = new Vector2(0,0);

                rb.velocity = new Vector2(0,0);

                climbm();

谢谢我希望这有帮助!上帝保佑