#じゃべめも

じゃべめも棚卸し

画面サイズあれこれ

スマホ向け作る際に画面のアスペクト比を変える必要があったので Edit > Project Settings > Player か BuildSettings > Player Settings に、画面回転の設定があるので任意のものにしておく。 デフォルトだと画面回転が有効担っているのでOFFにしておく

カメラのアスペクト比は実行環境に依存するので、Gameウィンドウの方で調整する UIのアスペクト比Canvas Scalarの設定をScale With Screen Sizeに、 レファレンス解像度は720x1280とかで

Unityでの動画の扱い

読み込める形式にはいくつか制限があるが、H264コーデックなら大丈夫。 VideoPlayerコンポーネントに、ビデオクリップを取り付ける。 ビデオクリップは、対象のカメラ及びレンダーテクスチャに画像を送り付ける仕組み レンダーテクスチャに送り付ければ、何かと取りまわせる

スクリプトからアニメーションカーブの操作

UnityでAnimationClipをスクリプトから編集する - Qiita

  • AnimationCurveクラスに添え字でアクセスすると、Keyframeを取得できる。 var key = curve[curve.length -1];
  • Keyframeのvalueを更新後、AnimationCurveに通知する必要がある key.value = 1; curve.MoveKey(curve.length - 1, key);

Unityで反射ベクトルの計算

反射ベクトルを求める - Qiita まだ飲み込みきれてない

void OnCollisionEnter(Collision other){
  ContactPoint point;
  foreach(ContactPoint p in other.contacts){
    point = p;
  }
  var reflect = Vector2.Reflect(this.rigidbody.velocity, point.normal);
}

実際に使ってみると上記では作りにくかったので、こんな感じで

if(other.contacts.Length > 0){
  ContactPoint2D point = other.contacts[0];
  var reflect = Vector2.Reflect(this.rigidbody.velocity, point.normal);
}

Unityで衝突点の取得

自分用Unityメモ:衝突位置を取得する(トリガーの場合も) - かさたな日記

// コリジョンの場合
void OnCollisionEnter(Collision other){
  Vector3 hitPos;
  foreach(ContactPoint point in other.contacts){
    hitPos = point.point;
    point.normal; // 接触点の法線
  }
}

// トリガーの場合(精度はよくない)
void OnTriggerEnter(Collider other){
  Vector3 hitPos = other.ClosestPointOnBounds(this.transform.position);
}

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;
}