Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。2016.04.11今回はキャラクターの足の位置と角度を地面に合わせる機能を作ってみたいと思います。Subscribe!Su...www.youtube.comこちらの動画を参考にさせていただきました。IKに関してはUnityのIKを使って物を運ぶアニメーションUnityのIKを使ってキャラクターが物を運んでいるようなアニメーションを作成していきます。gametukurikata.com2016.03.16の記事を参考にしてください。↑のような感じで足を地面の位置と角度に合わせる事が出来ます。片足が空中にある時は別途なんらかの処理を加える必要がありそうです。足の位置や角度を地面に合わせるやり方を考えます。足の位置をアニメーションとは別に地面に合わせる必要があるのでIKの機能を使います。地面に位置と角度を合わせるので、足が地面と接地している個所を調べる必要があります。その為にPhysics.Raycastを使ってキャラクターの足から下にレイを飛ばし常に接地面を調べるようにします。スポンサーリンク足からレイを飛ばし地面の情報を取得するスクリプト手のIKを使った時と同じようにキャラクターにレイを飛ばす位置を設定し、そこからレイを飛ばし地面と当たった位置と角度に足のIKを設定します。ここまでは手のIKの時と同じ事をしています。足のIKの場合、立っているアニメーションの時はレイの当たった位置にIKのウエイトを1にして位置を設定すればいいんですが、歩いている時や走っている時に常にウエイトを1にしているとヒザ神(ロンドンハーツから引用)のような動きになってしまうのでアニメーションの動きにしたがってウエイトを変更していく必要があります。この処理は後でやります。既存のキャラクターに足のIKを施すスクリプトFootIKを新しく作り取りつけます。leftFootRot);}}}}スクリプトを少しづつ見ていきます。0.3f;useIKは足のIKを使うかどうかで、インスペクタでチェックのオン・オフを出来るようにします。useIKRotは足の角度を地面に合わせるかどうかです。rightFootWeightとleftFootWeightは両足のIKのウエイトを入れます。rightFootPos、leftFootPosは両足の位置、rightFootRot、leftFootRotは両足の角度を入れます。offsetは足を置く位置のオフ設置値です。rayRangeは両足から下側にレイを飛ばす距離です。rayPositionOffsetは足が接地する地面の位置と角度を取得する時にレイを足先から飛ばしますが、その位置の上へのオフセット値を指定します。これは足先からレイを飛ばすとアニメーションと接地部分の関係から地面の下に足先が来てレイが地面の下から出てしまう現象の対処のために足先より上からレイを飛ばす為の調整値です。Passにチェックを入れていると呼ばれるメソッドです。useIKがfalseの時はそれ以降の処理をしないようにreturnします。両足からレイを下側に飛ばし、地面に接触していたらその位置と角度を保持します。レイの当たった位置はhit.pointで得られますが、角度は上側の方向と接触面の表面の方向から計算した角度に自身の足の角度をかけて求めます。得られた情報はそれぞれのフィールドに保持しておきます。(AvatarIKGoal.RightFoot)で右足のIKの位置を取得出来ます。useIKRotがtrueの時だけ足の角度を地面の角度に合わせます。RightFootWeightとLeftFootWeightはアニメーションカーブの値をそのまま設定します。アニメーションカーブはこの後作成します。アニメーションの再生位置によってIKのウエイトを変更するアニメーションの再生位置でIKのウエイトを変更出来るようにします。立っている状態のアニメーションIdleの場合は常にウエイトを1にして、レイの当たった位置に足を合わせるようにします。アニメーションのCurveを使うとアニメーションの状態によってアニメーションパラメータの値を変更出来ます。アニメーションパラメータの名前と同じ名前をCurveの名前に指定すれば、アニメーションパラメータの値にCurveの値がそのまま設定されます。アニメーションカーブに関してはUnityのキャラクターのアニメーションの動きに応じてコライダのサイズを変更するUnityで使う当たり判定(コライダ)のサイズをアニメーションに応じて変更し、ジャンプ中のキャラクターのコライダのサイズを変更し狭い空間を通過出来るようにしてみます。gametukurikata.com2016.04.08を参考にしてください。アニメーションパラメータを作成します。上のようにRightFootWeightとLeftFootWeightと名前を付けます。次にIdleの状態のアニメーションを選択します。上がIdleに設定しているアニメーションです。これを選択し、インスペクタ上のCurveを作成します。Curvesの+の部分をクリックしRightFootWeightとLeftFootWeightを作成します。ここでつける名前はアニメーションパラメータと同じ名前にします。値の部分を1と設定し、常に1になるようにします。これでIdleのアニメーションのCurveの設定は終了です。次に走るアニメーションのCurveを設定します。上のようにアニメーションの動きが見えるようにウインドウを動かしておきます。Idleのアニメーションの時と同じようにCurveにRightFootWeightとLeftFootWeightというパラメータを作成します。次に足の着地時はウエイトを1に、離れた時はウエイトを0になるようにCurveのパラメータを変更します。右足の着地時にRightFootWeightのウエイトを1にします。アニメーションで右足全体が着地した地点を探します。その部分を見つけたら、RightFootWeightのKeyを足すアイコンをクリックし、パラメータを1に設定します。今回の場合はアニメーションの最初に右足着地しているので、Keyの追加をする必要はないかもしれません。次に右足が離れる部分までアニメーションを移動します。右足が離れる部分でRightFootWeightのKeyを追加し、パラメータを0に設定します。右足が離れているアニメーションの間はウエイトを0に設定し、着地したら1に設定します。足が空中にある間から着地までのちょっとの間はウエイトが0から1になめらかに遷移するようにします。右足の設定が終わったら、左足の設定も同じようにしてください。設定が終わったらUnityの実行ボタンを押してください。足のIKがうまくいくか見てみましょう。確認の為にIdle状態の時にRunのアニメーションを設定します。(キー操作なくアニメーションの動きを確認する為)キャラクターをコピーしFootIKをOnにしたキャラクターとOffにしたキャラクターのアニメーションを比較し、本来のアニメーションと差異がないようにCurveのパラメータを設定していく必要があります。設定が終わったらIdleのアニメーションをIdleに戻し、IKの部分を見ていきましょう。上記のように足がきっかり着地した時や離れた時ではなく、右足を前に出した後降りてくるあたりでキーを作り、値を1にして、右足が地面を離れる時にキーを打ち値を0、先ほど作った値1のキーの少し前にキーを作り値を0にすると滑らかな感じになるかもしれません。以下のような感じです。出来たと思ったのに足が地面に届かないんー、まったく出来ておりません・・・・(+_+)右足は何となくレイの当たった位置に固定されているようですが、左足がレイの当たった位置に到達しません。キャラクターを動かすスクリプトをOffにして、キャラクターを選択し、TransformのYの位置を下げてみます。上のように左足もうまく接地しました。今度は地面をキャラクターを押し上げる感じで下から上に移動させます。上のように足の位置が接地し、角度も地面に合っています。最初の画像ではRayが地面に当たっていてIKの設定もうまくいっているはずなのに、なぜうまく接地しないのかというと体の重心が右足部分を基点にしているから左足は伸ばしているけど地面に到達しない為です。下から地面を上げた場合は到達点をキャラクターの足によせてるので問題が出ません。足が地面に到達しないのはコライダの影響かも足が空中に浮いてしまう場合もあるので、両足の距離を計算しコライダの位置を変更することで対応してみます。処理を追加していきます。Time.deltaTime);}}isChangeColPosはコライダの位置を調整するかどうかの設定です。distanceは右足と左足の距離の半分を入れます。defaultCenterはコライダのCenterの位置の初期位置です。smoothingはコライダの位置を調整する時のスピードです。OnAnimatorIKメソッド内の最後に処理を追加します。Math.Roundを使って両足のY軸の位置を小数点以下2桁までに丸めて差の絶対値を計算します。CharacterControllerのcenterの位置のY軸の位置をデフォルト値からdistanceの値を足して調整します。地面となるゲームオブジェクトにはFieldレイヤーを設定し、確認してみてください。体の重心位置を変化させる方法コライダのcenterを変更することで足の位置を地面に合わせるようにしましたが、AnimatorのbodyPositionの位置を変更することでも出来ます。こちらの場合はキャラクターの重心の位置を変更するのでコライダを調整する必要がありません。nowBodyPosition;}}}基本的には既に作ったスクリプトと同じですが、足の位置を指定した位置に移動する際に徐々に変化させるのではなくすぐさまその位置へと移動させています。コライダのcenterを変更していた部分をAnimatorのbodyPositionを変更するように変更しました。体の重心を変化させるのは右足と左足からのレイが両方とも地面に接触している時だけ行う事にしました。これは片足が地面にあり、片足が空中に浮いている場合に不必要に足が曲がってしまうのを避ける為です。体の重心位置を変化させる時は右足とキャラクターの基点(足元)との距離と左足とキャラクターの基点との距離を計算し、より下側にある方に体の重心を移動させます。することによって坂を下っている時はより下にある足の方に重心が下がるので足を地面に接地させることが出来ます(足が届きます)。地面と判定するレイヤーはキャラクターに取り付けたNewFootIKのインスペクタのFieldLayerの部分から選択してください。今回変更した結果は以下のようになりました。キャラクターの歩行アニメーションのCurveで設定しているRightFootWeightとLeftFootWeightによっては足がすり足になってしまいます。ウエイトが1になるのが遅いと足が地面に付く前に地面にめり込んでしまうこともあるのでカーブの作り方は調整が必要です。今回はPS4のニーアオートマタを久しぶりにやっていて2Bの足が綺麗に地面についているのを見て同じように滑らかに接地する足の機能を作りたい!と思って少し修正してみました。終わりにこれでIKを使って足の位置と角度を地面に合わせる機能が完成しました。今回の修正である程度機能としては出来たのではないかと思います。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事アニメーション・アニメーターUnityアニメーターのBlendTreeで細かい動作をさせるUnityのブレンドツリーを使ってアニメーションの切り替えを細かく設定し、向きを変える時の角度によってアニメーションを変更するようにしますアニメーション・アニメーターUnityのアニメーターコントローラのBlendTreeを使うUnityのアニメーターコントローラーのブレンドツリーの機能を使ってアニメーションを細かく切り替えてみますアニメーション・アニメーターステータス画面UIのオンオフをUnityのAnimationで行うステータス画面UIのオンオフをUnityのAnimationで行います。UIゲームオブジェクトのオン・オフで単純に消したり登場させたり出来ますが、少しだけ演出を加えてUIを登場させてみましょう。Controllerを使って既存のAnimatorControllerのアニメーションクリップを上書きしてみます。Sourceの設定等を見ていきます。アニメーションの遷移途中で中断し次の状態へとうまく移行させる為のサンプルも作成します。アニメーション・アニメーターUnityのIKを使って物を運ぶアニメーションUnityのIKを使ってキャラクターが物を運んでいるアニメーションを作成していきますUnityのキャラクターのアニメーションの動きに応じてコライダのサイズを変更するUnityでよく使う便利な標準関数についてホームアニメーション・アニメータースポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。プロフィールになってないな・・・・(-.-)Unityをこれから始める人へこれからUnityを使ってみようという方はUnityを使った3Dゲームの作り方(かめくめ)の歩き方Unityを使った3Dゲームの作り方(かめくめ)で、はじめてUnityの学習をする時の当ブログの記事を読む順番を書きました。機能を積み上げていく形になるので便利かも?gametukurikata.com2019.06.21の記事に記載の順番で見て頂くとUnityの基本的な使い方がわかり、簡単なアクションゲームや、TPSゲームの作成までが出来ます。自作タイピングゲームタイピングゲームを作りました。WebGL形式なのでPCのブラウザで遊べます。以下からプレイ出来ます。FinalTypingUnityを使って作成したローマ字入力のタイピングゲームです。gametukurikata.com2022.01.02お知らせ2023/01/24個人的にUnity2022.2.3f1をインストールしました。2022/10/14UnityのIKを使って足の位置と角度を地面に合わせる機能Unityのゲームでキャラクターの両足が別の高さの地面の上にある時にそれぞれの足をそれぞれの地面につけるようにする機能を作成しますgametukurikata.com2016.04.11機能を少し修正しました。2020/09/19コメント欄は閉鎖しました。今までコメントを投稿してくださった方はありがとうございました。(^^)/2018/08/07わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。gametukurikata.com2019.08.01Unityを使い始めたばかりの人がつまづきやすい点を解消するUnityを使い始めたばかりの人が結構な確率で陥る不具合や疑問点を解消していきます。基本的にはブログに寄せられた質問への回答という感じです。gametukurikata.com2018.12.04も参照してみてください。小・中学生によるデジタルコンテンツ開発の全国大会ですuycc.unity3d.jp2022年大会の先行エントリーが開始されているようです。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。記事の内容に質問がある方へUnityを使った3Dゲームの作り方(かめくめ)の歩き方UnityのJavaScriptとC#を読み替えてどちらでも対応出来るようにするホーム検索トップサイドバータイトルとURLをコピーしました。