今回は、左右に移動する床にUnityちゃんが乗った際に、床の動きと連動する処理を加えていきます。
久々にこのプロジェクトを開いて遊んでいたんですが、Unityちゃんが床にジャンプした際の動きが明らかに不自然だったので、改善したいと思います。今更感満載ですけどね・・・。
動く床に乗ったUnityちゃん(プレイヤー)を連動させる【Unity】
作業前の時点がこんな感じですね。
分かりやすいようにCubeを1つ横に配置していますが、Unityちゃんはその場にとどまっているように見えますね。
動画の途中で、Freeze Rotationの全てのチェックを外しています。そうすると、連動して動くようになりますが、Unityちゃんが倒れてしまってゲームとして成り立たないので、この方法はまずいです。
横移動している床は、このようなスクリプトにて動かしていましたね。ちなみに、RigidbodyのMovePositionを使っているのにもかかわらず、何故かUpdateメソッドになっていたのでFixedUpdateに修正しておきました。
ただ、今回はスクリプトからではなく、ステージを移動させるアニメーションを作成して対処するほうが簡単なのでこちらを起用します。
移動用のアニメーションを作成する
移動する床オブジェクトを選択して「Window」→「Animation」を選択します。
アニメーションの対象は床のポジションなので、Add PropertyからTransformのPositionにある+ボタンをクリックします。
左上にある録画ボタンをクリックして、好きな位置にキーフレームを追加していきます。私の場合は、移動する前のスタート地点が「19」ですので、0フレーム目を19に設定します。
そこから30フレーム毎にキーフレームを作成して少しずつ動かしています。具体的な値は画像の通りです。キーフレームは、フレーム数が書かれている部分をクリックすると作成されます。
キーフレームを作成したら、インスペクターから好きなポジションの値を入力してください。
設定が完了したら、再び録画ボタンをクリックして、0フレーム目に戻しておきます。
この時点で、対象のオブジェクトには「Animator」がアタッチされているので、ゲームを実行して設定した通りに移動するか確認すると良いでしょう。
後は、床オブジェクトにアタッチしておいたスクリプトを修正します。
床はアニメーションによって移動させるので、SetParentを使ってプレイヤーを床の子オブジェクトに設定しましょう。
上手くいきましたね。プレイヤータグを使ってUnityちゃんが床に乗った時のみ、連動するようにしているので、Cubeは逆に静止するようになります。
タグの設定によって、連動の切り替えが出来るので、管理はしやすいと思います。
ただ、物理運動の影響を受けないので、最初の動画のように左右端に移動した際にCubeがバウンドしなくなるので、ゲームの仕様によって使い分ける必要はあると思います。