鎖挙動の学び
最初は謎模様ジェネレータで見かけた、2点間の補間(線形補間)を使った関数で軌跡を作成してみたものの、この場合比率に対する位置が等間隔にならないためお蔵入り。 (等間隔にしないと鎖のパーツを置いた時、重なって見えるため。)
次に、90度または-90度の静的な角度(最初と終わり)と、ホーミングする自由な角度とを作成して、その適応割合を時間で変化させる作戦。
まず、適応割合は、一度下降してから上昇する、U字を描きたいのでsinを使用してみた。
このままだと値域が-1~1なので、1増やして0~2にする、これを0.5倍にして0~1を作成した。
e = (sin(theta) + 1) * 0.5
次に、90度または-90度の静的な角度。これは最初、進行方向をスプライトに合わせて上を基準にしていたので、0度で上へ移動、180度で下に移動。になっていた。
この時、ホーミング角度との補間の計算が意味不明なことになったので取り止め、スプライトを右向きにして、0度は0度として振る舞うよう修正。基準角度を右向きにするのはかなり大切。
ホーミングの自由角は、座標の差分を取って、Atan2で作成。
ただ、この時Atan2の仕組みを知らなかったので、補間関数をかませるとすこぶる変な動きに。 静的な角度は、最初0~360にしていたのを、-PI/2~PI/2にすることで、大半の場合の補間を生かす。
第2象限と第3象限間の補間の時だけ、このままではバグるので、そこだけ負数なら+2PIすることで0~2PIの値域にする。
値域変更のトリガは、自由角度のCosを使う。この値が負数なら、第2、第3象限を取り扱ってる事が分かる。
普通に速度を持たせて、一定の間隔で鎖を配置すると、曲がる所でスピードが変わって鎖の密度が変わってしまう・・・
普通の直進弾を先ず計算して、SINで補正値を足すやり方出も良いが、場所によってスピードが変わって鎖の設置位置がズレるのでNG
移動方向を左右に振って、移動距離は「角度*速さ」を維持するようにする
code:cs
if(cnt == 0) this.originalAngle = this.Angle;
var snakeAngleDeg = Mathf.Sin((Time.fixedTime - this.startTime) * this.freq) * this.radius;
var fixDeg = this.originalAngle + snakeAngleDeg;
this.Angle = fixDeg;