#じゃべめも

じゃべめも棚卸し

Unity壁に衝突してジグザグの研究

どうにもこうにも

  • 案1 接触した際に対称との距離を取って衝突方向判定
    • めり込んで奥のマップチップと衝突して変な反射になる
  • 案2 プレイヤーの接地判定を上下左右で
    • ->同上
  • 案3 衝突座標の法線方向を取得して反射ベクトルの計算
    • ー>物理演算的な動きになってジグザグが汚い
    • 矩形を並べたマップチップと衝突しているのになぜか法線が斜めってる
  • 案4 法線方向から向きを判定して現在ベクトルを反転

衝突座標の法線方向のうち、絶対値の大きい方を採用してみるものの、衝突判定が複数回走ってるようで謎

どうも、モノビヘイビアー>エネミーベースって形で継承を使ってるのが不味い臭い。 継承を使うと、なぜか衝突判定が2回走る事になるので、Unityで継承は使わない方が良いかも。

2回衝突回避コード

private bool is_collide = false;
public void OnCollisionEnter2D(Collision2D other){
  if(is_collide == true){ return; }
  is_collide = true;

  // something else
}
private void LateUpdate() {
  this.is_collide = false;
}

案4の処理

private bool is_collide = false;
public void OnCollisionEnter2D(Collision2D other){
    if(is_collide == true){ return; }
    is_collide = true;

    if(other.gameObject.tag == "Nostalgia"){
        if(other.contacts.Length > 0){
            ContactPoint2D point = other.contacts[0];
            var current = this.currentVect;
            if(Mathf.Abs(point.normal.x) > Mathf.Abs(point.normal.y)){
                current.x *= -1;
            }else{
                current.y *= -1;
            }
            this._rig.velocity = current;
            this.currentVect = current;
        }
    }
}

private void LateUpdate() {
    this.is_collide = false;
}