一般是添加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;
}