Unityを使った3Dゲームの作り方(かめくめ)ゲーム開発エンジンUnityを使った3Dゲームの制作に参考になる情報を公開しています。コピー2020.04.04今回はUnityのラグドール機能を使って銃などのダメージを受けてバタッと倒れたキャラクターがアニメーターコントローラーの制御に戻って立ち上がる機能を作成したいと思います。前の記事でラグドールを使ったヒットリアクション機能を作成しましたが、そちらで作成した敵の移動機能やスクリプトの処理も使っているのでそちらの記事も参照してください。Unityのラグドールを使ったヒットリアクションの作成Unityのラグドールを使って銃でダメージを受けた時の敵のダメージアクション機能を作成していきます。gametukurikata.com2020.03.06今回の機能を作成すると以下のようなものが出来上がります。上の動画ではダメージを受けたら即座にラグドールを使ってダウンしていますが、ヒットリアクションと組み合わせた機能は最後の方で紹介します。スポンサーリンクラグドールでダウン後の起き上り機能の概要ラグドールを使ったダウンのアニメーションは攻撃を与えた時にその部位のコライダに力を加え、CharacterControllerやAnimatorコンポーネントを無効化し、ラグドールの機能だけで倒れるようにします。起き上りの機能はラグドールで倒れたキャラクターがどの向きを向いているかを調べ、その状態に近いアニメーションを再生させることで実現させることにします。ラグドールでダウンしたキャラクターの位置や角度はダウンする前の位置や角度から動いたり、ダウン後のキャラクターとAnimatorControllerで設定しているアニメーションの位置と角度が合いません。単純にCharacterControllerとAnimatorを再度有効にするだけでは実現出来ません。ラグドールでダウンしたキャラクターの両足の位置の間の位置の計算とキャラクターが倒れた方向からキャラクターの角度を計算し、AnimatorControllerの制御に戻す前に位置と角度を変更しておきます。細かい処理はスクリプトの解説部分を見て頂くとわかると思います。敵キャラクターにラグドールを取り付ける敵キャラクターにはCharacterControllerの取り付けとコライダの設定がされており、ラグドールが取り付けられている必要があります。Unityのラグドールを使ったヒットリアクションの作成Unityのラグドールを使って銃でダメージを受けた時の敵のダメージアクション機能を作成していきます。gametukurikata.com2020.03.06の記事を参照して設定してください。ダウン後の立ち上がりアニメーションダウン後の立ち上がりアニメーションは各自用意してください。(^_^;)ヒットリアクション機能で参考にした方のプロジェクトで使用していたアニメーションは著作権がどうなっているのかわからないので、そちらは使わずわたくしは自作しました。キャラクターの基点は足元にして作成し、アニメーションはキャラクターのダウン後の状態と立ち上がった状態を回転して作り、その間のフレームを手と足のIKを動かして立ち上がるようなアニメーションに仕上げました。上はうつ伏せからの立ち上がりアニメーションですが、その他横向きからの立ち上がりアニメーション、仰向けからの立ち上がりアニメーションを作成しておきます。横向きからの立ち上がりアニメーションは左右の違いはUnityのMirrorで対応するので左向きか右向きかのアニメーションをひとつだけ作ります。どのアニメーションでも同じ方向を向いて立ち上がるようにしておきます。TypeをHumanoid型にしたらアニメーションの設定を行います。以下はGetUpFromBackアニメーションの設定です。Poseのチェックを外しているのは立ち上がりアニメーション後にスーッと元のキャラクターの位置に戻るのを避ける為です。Massにしています。アニメーションの作り方やUnityでのアニメーションの設定によってはスクリプトの処理を変える必要があったり、処理がうまくいかないこともあります。アニメーションクリップの設定に関してはUnityのAnimationClipのルートモーションの設定UnityのAnimationClipのルートモーションの設定等をみていきます。アニメーションの最小の構成要素です。キャラクターの重心です。リターゲティングエンジンに使用され、最も安定したディスプレースメントモデルを提供します。ポーズに対して相対的です。docs.unity3d.comも参照してみてください。敵のAnimatorに設定するAnimatorControllerの状態と遷移は以下のように作ります。アニメーションパラメータ―はfloat型のSpeed、Trigger型のGetUpFromBack、GetUpFromProne、GetUpFromLeftSide、GetUpFromRightを作ります。GetUpFromBackは仰向け立ち上がり、GetUpFromProneはうつ伏せからの立ち上がり、GetUpFromLeftSideは右側で横たわり左側に立ち上がり、GetUpFromRightは左側に横たわり右側に立ち上がりの条件です。Idle→WalkはSpeedが0.1以上、Walk→IdleはSpeedが0.1以下IdleやWalkから対応するアニメーションパラメータ―がトリガーされたら遷移し、それぞれの状態からIdleへと遷移します。Timeにチェックを入れ、時間が経過したらIdleへと遷移するようにします。GetUpFromBack→Idleのインスペクタは以下のようになります。スクリプトの作成スクリプトを作成していきます。敵の移動スクリプト敵の移動スクリプトを作成します。0;}}}}}移動処理に関してはヒットアクション機能の時と変わらないので説明を省きます。Hpプロパティを用意します。GetUpスクリプトが立ち上がり機能のスクリプトでIsDamageプロパティでダメージ状態がどうかを判定し、ダメージを受けていなければ移動させています。立ち上がり機能のスクリプトGetUpを作成し、敵に取り付けます。ラグドール機能でダウンしてから立ち上がる機能のスクリプトを作成していきますが、ヒットリアクション機能のHitReactionスクリプトと同じ部分の説明は排除しています。フィールド宣言とStartメソッドまずはフィールド宣言部分とStartメソッドを見ていきます。{myBodyParts.Add(t.transform);}SetKinematic(true);}RagdollStateにGetUpとRagdollを追加します。IsRagdollプロパティは現在ラグドールで倒れている状態かどうかを表します。ラグドールでダウンする時はダメージを与えないようにする為、プロパティで確認出来るようにしています。rayPositionは倒れたキャラクターの向いている方向を確認する為のレイを飛ばす位置を設定します。Pelvisというボーンを設定します。lengthOfFrontAndBackRayはレイを飛ばす位置から前後に飛ばすレイの長さを設定します。Pelvis)の位置から前後にレイを飛ばしますが、そのレイの長さです。lengthOfLeftAndRightRayはレイを飛ばす位置から左右に飛ばすレイの長さを設定します。Pelvis)の位置から横にレイを飛ばしますが、そのレイの長さです。timeToGetUpはラグドール状態になってからAnimatorControllerの制御に戻すまでの時間を設定します。UpdateメソッドUpdateメソッドではキャラクターの状態に応じた処理をしています。RagdollState.Animated;}}}RagdollState.GetUp状態の時にAnimatorControllerの状態がIdle状態になったらragdollStateをRagdollState.Animatedに変更しAnimatorControllerで制御している状態とします。ラグドール状態から立ち上がり状態へと変更するメソッドの作成ラグドール状態から立ち上がり状態へと変更するメソッドを作成します。RagdollState.GetUp;}ChangeToGetUpメソッドはラグドールからAnimatorControllerでの制御に戻す時に呼ぶので、最初にSetKinematicメソッドを呼んでラグドールを無効にし、CharacterController、Animatorを有効にして通常の制御に戻します。Animatorの右足と左足のボーンを足して0.5を掛けてその間の位置を計算し、averageFootPosに入れます。足の間の1m上から足の間の1m下までレイを飛ばし、Fieldレイヤーを設定した地面にぶつかった位置の情報をhitに入れます。ここで、地面にするゲームオブジェクトにはFieldレイヤーが設定されている必要があります。Pelvisのボーン(中心)にしたのでその為の調整をします。Pelvisを設定してしまいましたが)の位置から足の間の位置を引いたベクトルを計算します。キャラクターの位置をhit.point(足の間の地面の位置)にオフセット位置を足した位置にします。Position(XZ)をOriginalにしていた場合はhit.pointのままでいけると思います(アニメーションの作りによりけり)。ここで位置を変更しているのは、ラグドールで飛ばされたキャラクターと、ラグドールになる前のキャラクターの位置を合わせる為です。次にキャラクターがラグドールで倒れた後の体の向きに応じてAnimatorControllerで再生するアニメーションを変更する処理です。横向きに倒れたかどうかを判定します。Pelvisのボーンを設定します。Pelvisのボーンのローカルの向きで体の横に向いている矢印の色を確認します。Pelvisのボーンの横方向は青色の矢印で、これはローカルのZ軸を表しています。PelvisボーンのZ軸(transform.forward)の方向にlengthOfLeftAndRightRayの長さのレイを飛ばしFieldレイヤーのゲームオブジェクト(地面)と接触したかどうかを判定します。この時はキャラクターの左側が地面の方向です。キャラクターが横向きの時はキャラクターの足元の向きの方向にキャラクターの向きを合わせる為、キャラクターの足元からレイの位置を引いてキャラクターの足元の方向を求め、その方向にキャラクターを向けています。足の間の位置のYをrayPositionにしているのは高さをレイの位置と合わせる為です。0f);と直接AnimatorControllerの状態の指定と再生する位置を指定してアニメーションを再生しています。これはAnimatorControllerのアニメーションパラメータをトリガーするやり方だと元の状態からGetUpFromRightSideの状態へのブレンドが再生されてしまう為です(うまいやり方があるかもしれませんが)。animator.CrossFadeInFixedTimeを使って即座に立ち上がりアニメーションを再生させるようにしています。AnimatorのCrossFadeInFixedTimeを使うとAnimatorに設定したAnimatorControllerの第1引数で指定した状態の第2引数で指定した秒数の位置からアニメーションを再生してくれます。キャラクターの右側が地面の時も同じやり方です。横向きと判定されなかった時はうつ伏せから立ち上がりか仰向けから立ち上がりのアニメーションを再生します。Pelvisのボーンの前方は緑矢印でtransform.upで表せるので、レイの位置からtransform.upの方向にlengthOfFrontAndBackRayの長さのレイを飛ばし地面とぶつかるかどうかを調べます。前方に地面がある場合はうつ伏せで倒れたのでキャラクターの向きは足元の位置からレイを飛ばしている位置の方向に合わせます。仰向け(orどの条件も満たさなかった場合)の場合はキャラクターの向きはレイを飛ばしている位置から足元の方向の向きに合わせます。どちらも起き上がった時のキャラクターの方向を計算し、その方向をキャラクターが向くようにしています。今回はキャラクターのボーンから左右と前後にレイを飛ばして地面に対してどちらを向いているかを計算し、うつ伏せ、仰向け、横向きに応じてキャラクターの向くべき方向を計算しています。ラグドール→AnimatorControllerへのアニメーションの繋がりがおかしい時もあるようなのでここら辺の判別方法はもっと良い方法を探す必要があるかもしれません。ダメージ処理メソッドの作成ダメージ処理メソッドTakeDamageメソッドを作成していきます。hit.point);}ダメージを受けたらChangeToGetUpメソッドをtimeToGetUp秒後に実行するようにします。ヒットリアクション機能と同時に使う場合は通常のダメージはChangeToBlendメソッドを実行し、敵のHPが10で割り切れる場合はChangeToGetUpメソッドを呼び出すようにします。SaveBodyTransformとSetKinematicとInitializeRagdollメソッドTransformの保存メソッドSaveBodyTransform、RigidbodyのIsKinematicの切り替えメソッドSetKinematicとラグドールの初期化メソッドInitializeRagdollメソッドはヒットリアクション機能の時と同じなので説明は省きます。true;SetKinematic(true);bodyPositions.Clear();bodyRotations.Clear();}敵攻撃スクリプト敵を攻撃するスクリプトを作成します。hit);}}}}マウスの左ボタンを押した位置にカメラからレイを飛ばし、EnemyRagdollレイヤーが設定されたコライダの情報を取得し、GetUpスクリプトのTakeDamageメソッドを呼び出します。TakeDamageメソッドにはダメージ数とRaycastHit情報を渡します。これで機能が完成しました。10ダメージ毎にキャラクターがラグドールの機能でバタッと倒れるようにすると以下のようになります。終わりにラグドールを使ったヒットリアクション機能を作成したのでそれに付随したラグドールで倒れたキャラクターが立ちあがるまでの機能を作成しました。ラグドール→AnimatorControllerの立ち上がりアニメーションへの遷移はパッと切り替わってしまう感じがしますが、それなりな感じのものは出来たのではないでしょうか。ラグドールからAnimatorControllerへと切り替える時間timeToGetUpを短くしたり、ラグドールで倒れる時に加える力を強くして敵が吹っ飛ばされるようにするとうまく動作しない可能性もあります。いった不安定な要素を排除したい場合は細かい敵のダメージアニメーションを全部作りAnimatorControllerで全て制御するようにした方がいいかもしれません。コピーかめくめちゃんをフォローする7Unityを使った3Dゲームの作り方(かめくめ)Unityを使った3Dゲームの作り方(かめくめ)関連記事プログラムUnityの持ち物画面で装備スロットに装備品を入れる機能を作るUnityの持ち物画面で装備スロットにマウスのドラッグ&ドロップで武器を設定出来るようにしますプログラム主人公が乗ると数秒後に落下する床をUnityで作成してみるUnityのゲームで主人公キャラクターが乗ると数秒後に落下する床を作成してみますプログラムUnityでロープに捕まって崖から崖へ渡る機能の作成Unityでロープに捕まって振り子の要領で崖から崖へ渡る機能を作成していきます。ゴッドオブウォーに近づけるかも!?プログラムUnityで操作キャラクターの回りを旋回する攻撃ユニットの作成Unityで操作キャラクターの回りを旋回するユニットを作成し、ユニットの攻撃ボタンを押したら弾を発射する機能を作成していきます。プログラムUnityでキャラクターの移動をプログラミングしてみるUnityで3Dキャラクターモデルを配置し、キャラクターをCharacterControllerの機能を使って移動させるようなプログラミングをしてみます。プログラムUnityのRigidbodyのAddForceを使ったキャラクターの移動スクリプトUnityのRigidbodyのAddForceメソッドを使ったキャラクター移動スクリプトを作成していきます。Unityのラグドールを使ったヒットリアクションの作成UnityのCharacterControllerの進化版のOpenCharacterControllerを使ってみるホームプログラムスポンサーリンクサイト内検索が出来ますプロフィール管理人のかめくめちゃんです。(-_-)メールはこちらにお願いします(記事に関する質問は送らないでください、返信は期待しないでください(._.))。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をコピーしました。