ゲーム漬け
休暇前はゲーム開発のみならずアレコレと意識高めの計画を立てるも結局は部屋に引き籠ってゲーム三昧だった怠惰な皆さんこんにちは。
このGW中には東京ゲームダンジョン5が開催されていたので東京近辺にお住まいの方はそちらへ出向かれた方もいらっしゃるでしょうが、福岡住まいの私は飛行機+ホテル代の高さと別の予定の為に参加を断念し、10連休のほぼ6割をRise of roninに費やし、そのうちの7割ぐらいの時間を道場での鍛錬(ボスキャラと1対1での対戦モード)で過ごすという全く"無駄"以外に表現のしようがない休暇を過ごしました。おかげさまで石火(パリィ)は非常にうまくなりました。そしてそれを誰にも誇れない事が残念です。
パス移動
ゲーム制作をしているとオブジェクトの移動は通常の直線移動以外に経路に沿った移動(パス移動)も必要となる事も多く、そういった場合はこれまで主にDOTweenのDOPath/DOLocalPathを使っていました。
逆に現状Tween系最速のアセットLitMotionではDOPath/DOLocalPathに該当するメソッドは用意されておらず、対策としてUnitaskとforループを駆使して経由点毎に移動を繰り返すような処理を組んでみたのですが、その手法だと経由点が多くなると指定した時間では経路全体を移動し終えない事もあったりで、DOTweenからLitMotionへ完全に移行する事はできませんでした。
なのでちょっと視点を変えて、DOPathのように通過したい地点の配列を使用するのではなく、それら(経由点)を通るようなSplineを利用する手法を取ることにしました。
4点を通るSpline
Spline自体はUnity2022以降であればPackage Managerからインストールする事ができ、Unityエディタ上で簡単にSplineを作成してくれるTool機能がついているので手軽に作成する事ができます。
導入法や簡単な使用法についてはこのブログでも以前記事にしているので、そちらを参考にしてください。
そしてこのSplineは便利なことに0~1の割合を指定すればEvaluteメソッドによりSpline上の指定した点での位置、向き、法線ベクトルといった情報を取得する事ができます。
割合をTweenする
という事は、その機能を利用して以下の手順で処理すれば経路に沿ってオブジェクトを動かすことが出来そうです。
- LitMotionで割合の値(0~1)をTweenさせる
- その値をEvaluteメソッドに指定してSpline上の地点(ワールド座標)を取得
- Bindで取得した地点をTransformに反映する
コードに表すとこんな感じ
LMotion.Create(0.0f, 1.0f, 移動時間) .WithEase(Ease.Linear) .Bind( value => { // splineの位置、向き、法線ベクトルを取得 spline.Evaluate(value, out var splinePos, out var splineTangent, out var upVector); // Transformに反映 transform.SetPositionAndRotation(splinePos, Quaternion.LookRotation(splineTangent, upVector)); } );
上の処理を組み込んだコンポーネントを動かしたいオブジェクトにアタッチして動作させてみると
狙った通りに動かすことが出来ました。
まとめ
今回の手法ではDOTweenのDOPathと比べてSplineを作るという手間は増えますが、逆にSplineで描いた自由曲線に沿った移動が可能なため使い勝手は良いのではないでしょうか。例えば
上のような曲線もSplineを作成して先程の処理を利用すれば
曲線に沿って綺麗に移動させることが出来ます。