Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。6今回はキャラクターの足の位置と角度を地面に合わせる機能を作ってみたいと思います。Subscr...www.youtube.comこちらの動画を参考にさせていただきました。IKに関してはUnityのIKを使って物を運ぶアニメーションUnityのIKを使ってキャラクターが物を運んでいるようなアニメーションを作成していきます。20:33の記事を参考にしてください。↑のような感じで足を地面の位置と角度に合わせる事が出来ます。片足が空中にある時は別途なんらかの処理を加える必要がありそうです。足の位置や角度を地面に合わせるやり方を考えます。足の位置をアニメーションとは別に地面に合わせる必要があるのでIKの機能を使います。地面に位置と角度を合わせるので、足が地面と接地している個所を調べる必要があります。その為にPhysics.Raycastを使ってキャラクターの足から下にレイを飛ばし常に接地面を調べるようにします。スポンサーリンク足からレイを飛ばし地面の情報を取得するスクリプト手のIKを使った時と同じようにキャラクターにレイを飛ばす位置を設定し、そこからレイを飛ばし地面と当たった位置と角度に足のIKを設定します。ここまでは手のIKの時と同じ事をしています。足のIKの場合、立っているアニメーションの時はレイの当たった位置にIKのウエイトを1にして位置を設定すればいいんですが、歩いている時や走っている時に常にウエイトを1にしているとヒザ神(ロンドンハーツから引用)のような動きになってしまうのでアニメーションの動きにしたがってウエイトを変更していく必要があります。この処理は後でやります。既存のキャラクターに足のIKを施すスクリプトFootIKを新しく作り取りつけます。leftFootRot);}}}}スクリプトを少しづつ見ていきます。0.3f;isUseIKは足のIKを使うかどうかで、インスペクタでチェックのオン・オフを出来るようにします。rightFootWeightとleftFootWeightは両足のIKのウエイトを入れます。rightFootPos、leftFootPosは両足の位置、rightFootRot、leftFootRotは両足の角度を入れます。offsetは足を置く位置のオフ設置値です。rayRangeは両足から下側にレイを飛ばす距離です。isRightFootIKとisLeftFootIKはレイが地面に到達している時に足のIKを有効にします。smoothingは重心を落とす時のスピードを設定します。rayPositionOffsetは足が接地する地面の位置と角度を取得する時にレイを足先から飛ばしますが、その位置の上へのオフセット値を指定します。これは足先からレイを飛ばすとアニメーションと接地部分の関係から地面の下に足先が来てレイが地面の下から出てしまう現象の対処のために足先より上からレイを飛ばす為の調整値です。Passにチェックを入れていると呼ばれるメソッドです。両足からレイを下側に飛ばし、地面に接触していたらその位置と角度を保持します。レイの当たった位置はhit.pointで得られますが、角度は上側の方向と接触面の表面の方向から計算した角度に自身の足の角度をかけて求めます。得られた情報はそれぞれのフィールドに保持しておきます。(AvatarIKGoal.RightFoot)で右足のIKの位置を取得出来ます。isUseIKがtrueならばアニメーションパラメータのRightFootWeightとLeftFootWeightから値を取得し、IKのウエイトに設定します。RightFootWeightとLeftFootWeightはアニメーションカーブの値をそのまま設定します。アニメーションカーブはこの後作成します。アニメーションの再生位置によってIKのウエイトを変更するアニメーションの再生位置でIKのウエイトを変更出来るようにします。立っている状態のアニメーションIdleの場合は常にウエイトを1にして、レイの当たった位置に足を合わせるようにします。アニメーションのCurveを使うとアニメーションの状態によってアニメーションパラメータの値を変更出来ます。アニメーションパラメータの名前と同じ名前をCurveの名前に指定すれば、アニメーションパラメータの値にCurveの値がそのまま設定されます。アニメーションカーブに関してはUnityのキャラクターのアニメーションの動きに応じてコライダのサイズを変更するUnityで使う当たり判定(コライダ)のサイズをアニメーションに応じて変更し、ジャンプ中のキャラクターのコライダのサイズを変更し狭い空間を通過出来るようにしてみます。19:50を参考にしてください。アニメーションパラメータを作成します。上のように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の部分を見ていきましょう。出来たと思ったのに足が地面に届かないんー、まったく出来ておりません・・・・(+_+)右足は何となくレイの当たった位置に固定されているようですが、左足がレイの当たった位置に到達しません。キャラクターを動かすスクリプトをOffにして、キャラクターを選択し、TransformのYの位置を下げてみます。上のように左足もうまく接地しました。今度は地面をキャラクターを押し上げる感じで下から上に移動させます。上のように足の位置が接地し、角度も地面に合っています。最初の画像ではRayが地面に当たっていてIKの設定もうまくいっているはずなのに、なぜうまく接地しないのかというと体の重心が右足部分を基点にしているから左足は伸ばしているけど地面に到達しない為です。下から地面を上げた場合は到達点をキャラクターの足によせてるので問題が出ません。足が地面に到達しないのはコライダの影響かも足が空中に浮いてしまう場合もあるので、両足の距離を計算しコライダの位置を変更することで対応してみます。処理を追加していきます。defaultCenter;}}}isChangeColPosはコライダの位置を調整するかどうかの設定です。distanceは右足と左足の距離の半分を入れます。defaultCenterはコライダのCenterの位置の初期位置です。smoothingはコライダの位置を調整する時のスピードです。OnAnimatorIKメソッド内の最後に処理を追加し、アニメーションがIdle状態の時だけコライダの位置を調整する事にします(特に分ける必要もありません)。Math.Roundを使って両足のY軸の位置を小数点以下2桁までに丸めて差の絶対値を計算します。CharacterControllerのcenterの位置のY軸の位置をデフォルト値からdistanceの値を足して調整します。Idleアニメーション以外の時はデフォルトの位置に戻します。地面となるゲームオブジェクトにはFieldレイヤーを設定し、確認してみてください。終わりにこれでIKを使って足の位置と角度を地面に合わせる機能が完成しました。以前は空中に浮いて見えてしまう時に強制で位置を調整してましたがやめました。今回の修正である程度機能としては出来たのではないかと思います。2018.4.12版です。00:04これは質問と言うより要望なのですが...。「Rigdoll」というものをご存知でしょうか?モデルがダランダランになるやつですよね。それを、rigidbodyのaddforceでも使って上に飛ばしたとしましょう。すると、力抜けた人形みたいに落ちてきますよね。「どんな態勢からでも地面に手を付き足を立て、起き上がる」という機能は作れそうですか?聞いといてなんですが、とても難しそうですね...。17:48RagDollの存在は知っているんですが使った事はありません。(^_^;)試しにEthanに設定し使ってみました。RigidbodyとJointの設定を勝手に施してくれるんですね、キャラクターの通常のアニメーションはAnimatorで制御し、攻撃を受けた時にAnimatorを無効化しRigidbodyの物理挙動にまかせるんでしょうか。攻撃を受けた時にRigidbodyの物理挙動にまかせて地面に衝突した後、キャラクターからスクリプトでレイを前方、横、後方に飛ばしてキャラクターがどの方向を向いているかを調べ、その後Animatorを有効化し、該当するアニメーションを再生するという感じになるんでしょうか。このやり方だとうつ伏せ、仰向け、横倒しのアニメーションを作成し、体が地面に付いた時の体制から近いアニメーションを再生するという感じになるのでアニメーションを作る必要がありそうです。その時にターゲットマッチングで地面と手等は合わせる事は出来そうです。アニメーションを作らずIKやキャラクターの移動だけで立ち上がらせるのはなかなか難しそうですね・・・・。手をつき足を立てというのでなければ、攻撃を受けた時のボーンの位置と角度を保持しておき、ボーンの位置と角度をLerp等を使って元に戻すというのは出来ますが(スーッと機械的に元の位置に戻すだけ)・・・、お力になれず申し訳ありません。19:44ご指摘ありがとうございます。(._.)修正しておきました。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。サイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事への質問はコメント欄にお願いいたします)。kamekumechan@gmail.comいずれはSIRENやバイオハザードみたいなアクションゲームを作りたいと思っています。ゲームシナリオが書けないので面白いゲームはなかなか作れません・・・・。(^_^;)名前の由来はカメが好きだからです。Д`)シクシク...お知らせ2020/01/18個人的にUnity2019.2.18f1をインストールしました。2020/01/01あけましておめでとうございます。(^^)/ユニティちゃんのRPGを作ってみようのPartyStatusスクリプトでpartyMembersのListの型がCharacterStatusとなっていたのでAllyStatusに変更しました。変更したというか、元々AllyStatusに書き換える前のスクリプトを掲載していたので修正しました。ユニティちゃんのRPGを作ってみよう10ーコマンド画面の作成とステータスの表示ーユニティちゃんのRPGでコマンド画面の作成とステータスコマンドを作成し、選択したキャラクターのステータスを表示するようにしていきます。20:00GetPartyStatusメソッドの戻り値もそれに伴って変更しています。2018/08/07コメント欄へのわたくしの返信は停止しております。わたくしに出来る事は既に記事にしてあるので、ブログ右上の検索窓を活用してください。(._.)またブログの最初の方の機能を積み上げていく記事に関しての疑問点は当ブログ記事のスクリプトの説明と寄せられた質問への回答Unityを使った3Dゲームの作り方(かめくめ)の機能積み上げ形式の記事のスクリプトの説明と寄せられた記事の機能についての質問への回答を掲載しています。21:41も参照してみてください。コメントの返信はありませんが、回答は記事に反映されている可能性があります。当ブログはハイスピードプランです。WordPressの編集画面の動作が早くなった。Unityを使った3Dゲームの作り方(かめくめ).。