2017-04-05 19 views
0

私はポケモンゲームを作ろうとしており、衝突検出に問題があります。例えば 、私は右ここに入れたい場合:Unity 2D:衝突検出

Trying to go right

私はそれを行うことができるはずですが、私は移動することはできません。どちらのオブジェクトにもBoxCollider2Dがあります。 、0

BoxCollider of the player

木はサイズ1、1とboxcolliderを持っており、0オフセットそして、ここに私のコードです:これは、プレイヤーのBoxColliderある

void Update() 
{ 
    input = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")); 
    actualSpeed = Input.GetKey(KeyCode.LeftShift) ? walkingVelocity : runingVelocity; 

    if (input != Vector2.zero && p == transform.position) 
    { 
     anim.SetBool("isMoving", true); 

     if (Mathf.Abs(input.x) > Mathf.Abs(input.y)) 
     { 
      if (input.x > 0) 
      { 
       if (direction.Equals(Direction.Este) && canMove()) 
       { 
        p += Vector3.right; 
       }else 
       { 
        direction = Direction.Este; 
       }     
      } 
      else 
      { 
       if (direction.Equals(Direction.Oeste) && canMove()) { 
        p -= Vector3.right; 
       } 
       else{ 
        direction = Direction.Oeste; 
       } 
      } 
     } 
     else 
     { 
      if (input.y > 0) 
      { 
       if (direction.Equals(Direction.Norte) && canMove()) 
       { 
        p += Vector3.up; 
       }else 
       { 
        direction = Direction.Norte; 
       } 

      } 
      else 
      { 
       if (direction.Equals(Direction.Sur) && canMove()) 
       { 
        p -= Vector3.up; 
       } 
       else 
       { 
        direction = Direction.Sur; 
       } 

      } 
     } 
     anim.SetFloat("input_x", input.x); 
     anim.SetFloat("input_y", input.y); 

    } 
    else if (input == Vector2.zero) 
    { 
     anim.SetBool("isMoving", false); 
    } 
    transform.position = Vector3.MoveTowards(transform.position, p, actualSpeed * Time.deltaTime); 
} 

bool canMove() 
{ 
    bool b = true; 
    Ray2D r; 
    if (direction.Equals(Direction.Norte)) 
    { 
     r = new Ray2D(transform.position, Vector3.up); 
    } 
    else if (direction.Equals(Direction.Sur)) 
    { 
     r = new Ray2D(transform.position, Vector3.down); 
    } 
    else if (direction.Equals(Direction.Este)) 
    { 
     r = new Ray2D(transform.position, Vector3.right); 
    } 
    else 
    { 
     r = new Ray2D(transform.position, Vector3.left); 
    } 

    Debug.DrawRay(r.origin, r.direction); 

    RaycastHit2D hit = Physics2D.Raycast(r.origin, r.direction, 1f , 1 << 8); 
    if (hit.collider != null) 
    { 
     if (hit.collider.CompareTag("Obstacle")) 
     { 
      b = false; 
     } 
    } 
    return b; 
} 

どのようにプレイヤーをツリーの上に移動させることができますか?

ありがとうございます! PD。私はUnity2D

+0

直感的には、サイズ1×2のプレーヤースプライトが(私はで1,1をオフセット期待)木に衝突するだろうとロジックを思われます。プレーヤーのスプライトは1x1でなければならないのですか? – JHBonarius

答えて

0

この問題は、2つのコライダーの間の摩擦によって引き起こされるとかなり新しいよ、 あなたは物理マテリアル2Dを作成し、0 への摩擦を設定し、ボックス衝突2D材料に追加する必要があります。

また、障害物(ツリー)上のボックスの代わりにサークルコライダーを使用することも考えられます。

0

gameObjectsの境界線によって問題が発生している可能性がありますが、これはまだ交差している可能性があります。これを解決する1つの方法は、(1,1)の代わりにリジッドボディのサイズを(0.9、0.9)に設定することですが、オブジェクトで実行せずに移動を行うことができるかどうかをチェックする追加のスクリプトを追加する必要があります。

あなたはタイルベースのゲームを持っているので(これはポケモンのようです)、これは良い方法です。あなたがユニティエンジンで深くないときは、彼らのウェブサイトで初心者のチュートリアルをチェックしてください。ここにはRoguelikeのチュートリアルへのリンクがあります。これには、あなたが持っているのとまったく同じ動きが含まれています。すべてがきちんと説明されていて、チュートリアルですべてのスクリプトをコピーすることができます;)あなたが未知の新しいものを見つけるかもしれないことを見てください。

Tutorial