作ってるゲームの備忘録

Unityでゲームを作っててちょっと引っ掛かった点をまとめてみた。

マウスカーソルの位置に複数のオブジェクトがついていくプログラムを作成しようと、普通にカーソルの座標の方向へ距離に比例する力を加えたところ....

f:id:U-ki3891:20191224175039p:plain

失敗例1

このようにダマになってしまい、群れている感がなくなってしまった。
この問題を解決するために、いくつか解決策を試した。

ダマになってしまうと言うことで、オブジェクト同士の間隔を広げるためにオブジェクト同士の当たり判定を有効にした。しかし、球形の当たり判定をしているためにそれぞれのオブジェクト同士の間隔が球の半径を維持してしまい綺麗に整列しすぎてしまい、カーソルを移動した際もその形状を崩さずに付いてくるので気持ち悪いという結果になった。

f:id:U-ki3891:20191224180711p:plain

解決策1

次に、Boid理論を参考に群れの中心へ向かう力と、周囲の個体から離れる力と、周囲の個体と同じ速度になろうとする力をつけて実装してみた。中心を求める計算ではカーソルの位置を群れに含め、そのウェイトを重く設定した。しかし係数の調整が難しく、周囲の個体から離れる力がうまく働かず、結局ダマになってしまった。

次に、群れの中心へ向かう力にかける係数を個体ごとに異なる値にしてみた。すると、群れが尾を引きながらついてくるようになり、「これは群れを横に広げることができればうまい具合になるのでは」ということで、群れを横に広げる手段を考え始めた。

f:id:U-ki3891:20191224183511p:plain

解決策3

ここで一番最初に試したオブジェクト同士の当たり判定を有効にする方法を合わせてみたところ....

f:id:U-ki3891:20191224183853p:plain

解決策4

うまくいった。

しかし、カーソルが静止しているときに群れが振動してしまうという問題が残ったので速度に0.5をかけ続ける処理をしたところ、カーソルが静止しても群れが割と安定するようになった。

結論としては、個体ごとに異なるステータスを持たせると群れに乱雑さが生まれることがわかった。ブログ始めて書いてみたけど難しいねこれ。