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);
2点間の方向を向く
※手軽なやり方
var diff = (Vector2)to - (Vector2)from; (Transform)target.rotation = Quaternion.FromToRotation(Vector2.right, diff);
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; }