見出し画像

Unity2Dアクションの…物理演算…?

TETRADOTOXINのテトラさんです。
シトロンワールドという2DアクションRPGを作ってる金髪美少女です。

本作の目玉である変形武器アクションのひとつ「ワイヤーアクション」の改善をしました。こんな動きになっています。

動画内では駆け回って飛び跳ねてワイヤー移動する、といったアクションをしていますが、これをどう実装しているのか、といった話を他の手段と比較しつつ話せればと思います。

さいしょの壁

独自のアクションに限らず、Unityの2Dアクション、どう実装するのがいいのかわからない、といった問題。ゲーム作り始めてからというもの、周りでよく見かけます。

簡単にアクションゲームといってしまえば、入力したらキャラが動いて、動的な障害を超えていくもの以上の何物でもないので、それで満足できる人ならば、そこらのチュートリアルのガワを変えて、オリジナルのレベルデザインをするのが最適解かもしれない。
「ちょっとアクション作りたい」くらいならば既製品と同じ処理で満足できるものだと思います。

しかし!私が作りたいのは!本格!スピーディ!ロマン強めで手応えありつつ誰でも楽しめる硬派な2Dアクションだ!
キャラクター操作に対して最高の感触を提供したい、そうなってくるとちょっと難しいことを覚えないと戦えません。

ちょっと進めての知見

今回書きたいのはこれです。
現実的な慣性や重力にとらわれない操作感を追求したい場合で、キャラクターが物理的影響を与えるオブジェクトを実装する、となった場合、独自の実装が必須になります。
私と同じような条件の場合、おそらくRigidbody(2D)でやることになるんじゃないかな、ということでちょっとだけ各動作それぞれどうやってるか、みたいなことを書ければと。

その前に、そもそも2Dアクションに物理演算のイメージがないって方もいるかもしれませんが、どうなんでしょうね、私もイメージないです。でも一部だけ使ってます。

物理挙動の要となるRigidbodyは、質量や重力スケールの項目を設定して物理挙動をかんたんに実装したり、コライダーやトリガーとの接触を検出して処理を走らせたりできます。

しかしフィクションでは重力質量無視してなんぼなので、重力は0、質量は影響する項目がないのでとりあえず自動設定に任せ、衝突する他のRigidbodyがあるときに辻褄合わせる、という形で設定し、座標移動は入力に応じてRigidbodyの速度や座標を変える、といった手法をとっています。

Transform移動は当たり判定などを無視して座標を上書きする移動であるのに対し、Rigidbodyを介した移動は当たり判定を考慮して移動してくれます。Rigidbodyを付与したオブジェクトはRigidbodyに用意されているプロパティで移動させます。リファレンスを見るとたのしいです。

よく使うのは.velocityと.position。私の作品では、スティック移動やジャンプ、落下はvelocityで行い、ワイヤーの移動や移動床、攻撃に伴う移動の処理はpositionの値を加算することで行っています。

現在は度重なる修正を経てどれにどれを使っているか、この処理にどれを使うべきか、など把握していますが、学びつつ作りつつの段階ではよくわからないまま、あれもこれもと実装したのでごっちゃごちゃでした。
冒頭の動画でスムーズに行っているワイヤーアクションですが、最近までワイヤー移動にはspringjoint2Dという、バネ的挙動をシミュレーションしてくれるコンポーネントを使い、ワイヤー時間にともなってバネの長さと硬さを変えるという物理演算の暴力で実装していました。
しかし、余計なパラメータを使う物理演算は激重な上、フレームレートによって挙動が変わったり、座標系をコンポーネントに任せて制御手段がなかったりと、今思い返せば到底キャラクターに使うべきではないものを使ってたなと。
現在は普通にベクトルと距離から速度を計算してRigidbodyのpositionを加算する形で実装しています。

今後……

現段階でこのやり方でうまいこといってますが、velocity移動が今後リストラされるかもしれないと懸念しています。
処理が適切じゃないのか、そもそも物理がそういうものなのかよくわからないですが、ビルドした後だったり負荷がかかっていたりで毎回若干挙動が変わってる気がするので、おまじない的な認識で書いてるdeltaTimeあたりのfixedがどうとか、そういったので解決出来なければまたにらめっこが始まりそうです。

特に役に立つかも分からない記事になってしまいましたが、移動系についてちょっと駄弁ってみました。役に立ったかわかりませんが、よくわかってないジョイントを無理矢理プレイヤーにつけないほうがいいよってことだけでも覚えて帰ってください(ものによっては全然ありってことはお間違えなきよう)。
それではまた来週!

この記事が気に入ったらサポートをしてみませんか?