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():

    }


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

        }

你可能感兴趣的:(unity2d/3d)