unity2D人物移动撞墙体抖动

一般是添加box collider2D组件后 我们再给人物添加刚体组件,那么人物移动就用rigidbody2D.AddForce,撞击墙体是不会有抖动现象的。因为这种移动方式是带有物理特性的很难做到匀速移动,有时候我们移动是直接用transform.Translate,这是一种直接改变坐标的移动方式,当撞击collider的时候就产生了矛盾,一边要移动一边又受到collider影响要弹出来,所以就不停的抖动。
想到这样的解决方法
首先是
bool isWall=false
bool moveLeft=true;
bool moveRight=true;`

然后
void FixedUpdate(){

        if(Input.GetKey(KeyCode.D)){
        float   force_move_right=300f;
            moveLeft=false;
            if(isWall&&moveRight){
                force_move_right=0;
                //return;
            }else{transform.Translate(Vector2.right*Time.deltaTime*force_move_right);
                moveRight=true;
            }

        }

        if (Input.GetKey (KeyCode.A)) {
            float   force_move_left=300f;
            moveRight=false;
            if(isWall&&moveLeft){
            force_move_left=0;
                //return;
            }else{transform.Translate(-Vector2.right*Time.deltaTime*force_move_left);
                moveLeft=true;
            }
        }
    }
    当然后面碰撞体也添加一下。

public void OnCollisionEnter2D(Collision2D tag){
    if(tag.collider.tag=="Floor"){//这个是之前///做的
        isGround = true;
    }
    if(tag.collider.tag=="Wall"){
        isWall=true;
    }

}
public void OnCollisionExit2D(Collision2D tag){
    if(tag.collider.tag=="Floor"){
        isGround = false;
    }
    if(tag.collider.tag=="Wall"){
        isWall=false;

    }

}

发现之后继续再怎么改动,还是没有办法完美的实现,总是会出现这样那样的问题,所以还是放弃了。

有老老实实的回到addforce

float h = Input.GetAxis ("Horizontal");
float v = Input.GetAxis ("Vertical");
        if(h>0.05f){
            rigidbody2D.AddForce(Vector2.right*force_move);
        }else if(h<-0.05f){
            rigidbody2D.AddForce(-Vector2.right*force_move);
        }

        if(v>0.05f){
            rigidbody2D.AddForce(Vector2.up*force_move);
        }else if(v<-0.05f){
            rigidbody2D.AddForce(-Vector2.up*force_move);
        }
        一会在改进
        最后改到这样,还算感觉良好了
public float force_move=300;
    //public float jump_move=10;
    //private Animator anim;
    public bool isWall=false;
    void Awake(){

    //anim=GetComponent<Animator>():

    }


    void FixedUpdate(){
        if(Input.GetKey(KeyCode.W)){
            GetComponent<Rigidbody2D> ().drag = 6;
            rigidbody2D.AddForce(Vector2.up*force_move);
            if(force_move<=8000)
                force_move+=500;
        }
        if(Input.GetKey(KeyCode.S)){
            GetComponent<Rigidbody2D> ().drag = 6;
            rigidbody2D.AddForce(-Vector2.up*force_move);
            if(force_move<=8000)
                force_move+=500;
        }
        if(Input.GetKey(KeyCode.A)){
            GetComponent<Rigidbody2D> ().drag = 6;
            rigidbody2D.AddForce(-Vector2.right*force_move);
            if(force_move<=8000)
                force_move+=500;
        }
        if(Input.GetKey(KeyCode.D)){
            GetComponent<Rigidbody2D> ().drag = 6;
            rigidbody2D.AddForce(Vector2.right*force_move);
            if(force_move<=8000)
                force_move+=500;
        }
        if(Input.GetKeyUp(KeyCode.W)||Input.GetKeyUp(KeyCode.S)||Input.GetKeyUp(KeyCode.A)||Input.GetKeyUp(KeyCode.D)){
            force_move=200;

        }
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值