FPSを作ってみよう7-アニメーションの作成とUnityでの取り込み-

今回はUnityのFPSゲームで使用するアニメーションをblender2.76bで作成し、Unityで使用するところまでをやりたいと思います。

前回

FPSゲームでジャンプする機能を作成します。立っている時歩いている時と走っている時で飛ぶ高さを調整出来るようにしていきます。

FPSゲームのキャラクターにジャンプ機能を取りつけました。

スポンサーリンク

今回作成するアニメーション

今回作成するアニメーションは

キャラクターが立っている時や歩いている時などに銃を持っているアニメーション
キャラクターが銃を敵に向けるアニメーション
キャラクターが銃を撃つアニメーション

の3つを作成します。

アニメーションを作成する前の準備は

人型キャラクター作成ソフトMakeHumanで作成したキャラクターを3DCG作成ソフトBlenderへの取り込み方と出力、それからUnityへと取り込む方法
MakeHumanで作成したキャラクターをBlenderに取り込み、ボーンを設定しリグを取りつけます。Unityで使うアニメーションを作成する時に便利です

を参考にアニメーション付けをする仮のキャラクターを作成してください。

アニメーションを作成する方法は

Unityで使用するキャラクター用のアニメーションをBlenderを使って作成していきます。作成方法を学べば自分のゲームに自前のアニメーションを使うことが出来ます。

を参照してください。

アニメーションの作り方は上記の記事をご覧いただくと作成出来ます。
blenderでのリギング作業までは難しく感じるとは思いますが・・・・(^_^;)

もちろんアニメーションは自前でなくてもAsset Storeで探したものや他サイトで配布されているものを使用してもかまいません。
blenderの大変な作業をしたくない方はそちらの方がいいかも?

FPSゲームのキャラクターにStandard AssetsのEthanをモデルとして使いCharacterControllerコンポーネントを取りつけるまでをやります

で記載している通りボーンの設定の問題とボーンの設定されたキャラクターとアニメーションによっては元のアニメーションと変わってしまう事もあります。

それではblenderで作るアニメーションを見ていきます。
作り方はさきほど記載したリンク先を参照してください。

銃を持っているアニメーションGunIdleを作成

GunIdleのDopeSheet

まずはGunIdleアニメーションを作成していきます。

GunIdleアニメーションは銃を持っている状態で止まっているだけのアニメーションなので、フレームを1の所に移動して手の位置や足の位置を調整し
位置を保存するだけです(上の画像では0フレームに作成していますが1フレームにしてください)。

GunIdleのアニメーション

GunIdleアニメーションは銃を持っているように右手を丸め、左手を右手を添えるような位置に持っていきます。

左手のひじの角度は隙間だらけのボールみたいなやつ?(赤い四角の中)を動かして角度を調整してください。

これの位置を調整しないとひじの角度が窮屈な感じになってしまいます。

UnityでIKを使って左手の位置や角度は調整するので、左手は厳密に合わせなければと考えなくても大丈夫です。

IKに関しては

UnityのIKを使ってキャラクターがはしごを登るようなアニメーションを作成していきます。

等のIKに関する記事を参照してください。

右手の位置もIKで調整する事も出来ますが、今回は右手はちゃんと合わせておきます。

足の位置はUnity側で歩きや走り等の別アニメーションを下半身に設定するので気にしなくて大丈夫です。

銃を構えるアニメーションWaitShotの作成

WaitShotのDopeSheet

次は銃を構えるアニメーションWaitShotを作成します。

1フレーム目はGunIdleのフレーム1をコピーし(GunIdleのフレーム1上でフレーム全体を選択しCtrl+Cキー)、
WaitShotの1フレーム目を選択した状態でCtrl+Vキーを押してペーストします。

これは銃を構える前の状態はGunIdleと同じで、そこから銃を構える状態にしていくからです。
ここで同じ位置にない場合、UnityでGunIdle→WaitShotとアニメーションを遷移させた時に体がぶれてしまいます。

GunIdleでは下半身は気にしないでくださいと言いましたが、WaitShotの下半身は銃を撃つ時の下半身(移動していない時の)として使うので足を開いた状態を作ります。

次のフレームは10フレームでここでは銃を構え終わった状態で手の位置を移動させてキーフレームを打っています。

WaitShotの構え終わりのモーション

10フレーム目は↑のような位置に手を持っていきます。

銃を構え終わった時は手の高さが目の先の辺りにくるようにします。

Unityで使用するキャラクターによっては目の高さと手の高さが合わない事もあるので(blenderでアニメーションをつけてるキャラクターと目の位置が違う為)
アニメーションを作成した後にUnityに取り込み調整していく必要があります。

Unity側で両手ともにIKを使って位置を調整する場合は結果として右手が銃を持っている部分の作成のみで大丈夫かもしれません。

ただ今後は左手のみIKを使って記事の内容が進みますので、右手のIKの設定はご自分でしていく必要がありますのでご了承ください。

銃を撃つアニメーションShotを作成

次は銃を打った時のアニメーションShotを作成していきます。

ShotのDopeSheet

フレーム1、10、20にキーフレームが打ってあります。
フレーム1と20はWaitShotの10フレーム目をコピーしています。

フレーム10はフレーム1の状態から手の位置を少し上にあげ角度も上に回転させます。
フレーム10が銃を打った時の手の位置になります。

Shotの銃を撃った後の手の位置

↑がフレーム10の時の手の位置です。
フレーム0の時より手が少し上に位置しています。

これで銃を持っている時のGunIdle、銃を構えるWaitShot、銃を打つShotのアニメーションが出来上がりました。
File→Export→FBXを選択し、ForwardをZ Forward、ArmaturesのOnly Deform Boneにチェックを入れて保存先フォルダを指定しExport FBXボタンを押してください。

作成したアニメーションをUnityに取り込む

FBXファイルをインポートする

Unityのメニュー→Assets→Import New Asset…を選択し、さきほど出力したFBXファイルを選択します。

取り込んだFBXファイルの中身

↑が取り込んだFBXファイルです。

ひとつ作っていないはずのアニメーションがありますが、これは無視してください。

最初銃を持っている位置を右斜め下にしようと思って作っていたけど採用しなかったので残ってます。消し方がわからないので残ってます(^_^;)

使わないアニメーションの削除方法がわかりましたので追記

いらないアニメーションを削除したい時は、消したいアニメーションを表示した状態で、Shiftキーを押しながら×ボタンを押します。

作成したアニメーションを削除する

↑の赤い四角部分です。

すると、Fボタンを押していた場合は0に表示が変わります。

×ボタンを押すとFから0になる

この時点ではアニメーションが残っていますが、Blenderファイルを保存し、再起動するとそのアニメーションが削除されます。

アニメーションの削除の追記終了

FBXファイルのImportSettingsでHumanoid型にする

FBXファイルを選択してインスペクタを表示し、Import SettingsでRigをHumanoid型に変更してApplyボタンを押します。
これでUnityでHumanoid型として扱えるようになったので、キャラクターであるEthanにアニメーションを適用する事が出来るようになりました。

今回作成したアニメーションはある程度そのまま使用出来る状態のものを作成しています。

ですが、キャラクターの右手が銃を持っているような状態のアニメーション(右手部分だけあればよし)と下半身が銃を構えている時の状態があればUnityのIKを使うと厳密なアニメーションがなくてもなんとかなるかもしれません。

両手の位置はIKを使って銃を持っているようにみせて、銃を撃った時のアニメーションはUnity側のAnimationで銃の位置や角度を変更するアニメーションを作成すれば
手の位置や角度はIKで銃の手の位置に固定されるので銃の位置に合わせて手の位置が動き、銃を撃ったアニメーションが出来上がります。

blenderで作ったアニメーションがUnity側でうまく動作出しない時やうまく合わない時、そもそもblenderが使えない方はこちらの方法を試してみるのもありかもしれません。

次回はIKを使ってアニメーションを変更します

次回は作成したアニメーションをキャラクターに設定し、銃を構えたり撃ったり出来るようにしますが、今回アニメーションを作らず、両手のIKとUnityのAnimationで
銃を構える、撃つアニメーションを作りたい方用に両手のIKの設定と銃を構えるアニメーションの作り方も載せたいと思います。

なぜ次回になるかと言うと次回で初めてIKを使うことになるのでそれ以降に作成した方がいいと思うからです。

ただ、わたくしの記事の進め方としてはblenderで作成したアニメーションと左手のIKだけを使ったやり方になるので、
両手のIKとUnityのAnimationを使ったアニメーションの内容は書きません。

それと途中で出来なくなる可能性もあるので注意してください。

あくまでこういうやり方も出来ますよという補助的な内容になります。

スポンサーリンク

記事をシェアして頂ける方はこちら

フォローして頂くとやる気が出ます

コメント

  1. midori より:

    ありがとうございます。
    やはりプレイヤーの全体像モデルと銃を持った手のモデル この2つを用意すれば いい感じになりそうですね、亀さんもし宜しければ FPSの手のモデルとサードパーソンを使用したチュートリアルを時間がある時に出して頂きたいです。 
    7DAYZtoDieという UNITYで作られたゾンビゲームがあるのですが マルチプレイして銃を構えて上に向いて貰ったところ、プレイヤーを操作している方の画面はちゃんと銃を上に構えていますが 他者から見た場合上を向かず正面に銃を構えていました、これで 手のモデルと身体のモデル2つを使用しているということが分かりましたので 謎は解決したと思いきや実装出来ませんでした;; カメさんのSPINEでカメラの位置に合せて上半身の移動+手のモデルを合せれば第三者のプレイヤーから見てもちゃんと上を向いているようになるので期待しています、もし宜しければよろしくお願い致します、動画を探しまくったのですがhttps://youtu.be/A5bZEbz5hcA これぐらいしか人形modelを使っているものが無く、、パイソンを使っていたので、 よろしければよろしくお願いします ここで詰まっていて先に進みません(現在卒業制作で作っていて進まなくて禿げそうです) 引き受けて頂ければ 気持ち程度ですが寄せ付けさせて頂きます。

    • PhotonやUnityネットワークを使ったオンラインマルチプレイであれば、たぶんこれで出来ると思います。

      キャラクター登場時に自身のキャラクターか他のキャラクターかで機能の無効化をしていると思うんですが、わたくしの場合で言うとNetworkPlayerCheckスクリプトですね。

      https://gametukurikata.com/online/multiplay/multiplay4

      ここでキャラクターEthanの子要素として手のモデルがあるとして、Ethanの子要素にCubeを作り名前をFakeHand、またEthanの子要素にEthanを配置して体のメッシュ部分をMyEthanBodyとMyEthanGlassesと変更して試します。

      ゲームオブジェクトの無効化とコンポーネントの無効化の確認の為、二つ配置して確認します。

      キャラの子要素に手のモデルがあると仮定した階層

      ↑のように適当なゲームオブジェクトを手のモデルを置いたと仮定して試しました。

      キャラの子要素に手のモデルがあると仮定した画像

      ↑のように本来のキャラの前に手のモデルと仮定したCubeとEthanのモデルを置いているとします。

      NetworkPlayerCheckスクリプトで他のキャラだった場合に、そのキャラの手のモデルに該当するゲームオブジェクトを無効にするか、メッシュを見えなくします。

      手のモデルにスクリプトを設定していて、見た目がいらないだけならMesh RendererやSkinned Mesh Rendererを無効化します。

      オンラインマルチプレイであればこれで自身の手のモデルは見えるけど、相手方からは見えないという機能が出来ると思います。

      確認動画はこちらになります。

      ちょこっと追記します・・・。

      オンラインでなくてもオフラインでも同じような感じで出来るかもしれません。

      手のモデルのゲームオブジェクトにTagを設定しておき、ゲームオブジェクトのメソッドであるGetInstanceIDを使用して自身のインスタンスIDと違う手のモデルだったらそのゲームオブジェクトやレンダラー等のコンポーネントを無効化すれば同様の事が出来そうな気がします。

      試してみてください。

  2. midori より:

    全身の見た目を使用するとエイム時 正確な位置に銃のサイトをあわせるまでBLENDERなどで手の位置を真ん中に来るように設定しています UNITY側からきれいに真ん中にサイトをあわせることは可能でしょうか

    • 他の方はどうやっているんでしょうね?

      Unityで使用するキャラクターをモデルに使って(モデルが違うと微妙な差異が生じる為)Blender側でそのキャラクターでハンドガン、ショットガン等の銃の構えとアニメーションを作成し、目線の先と銃の先を同じ位置にしておけば、Unity側で目の位置にあたるカメラの位置を調整すれば照準と銃の位置を合わせる事が出来るような気がします(銃毎にカメラ位置を調整する必要がない)。

      銃の種類によって銃を構えた時の銃口の先が違うと、武器を切り替える機能を取り付けた時に銃口とカメラの中心が合わない等の制御が面倒な事がおきます。

      銃口の先を必ずしも当たり判定としないで、カメラの中心を当たり判定と割り切ってしまって微妙な調整をしないのもありかも?

      FPSはほぼやらないのでわからないんですが・・・、構えて撃つ場合と、手元に持ったまま撃つ場合でもカメラの中心を当たり判定としているゲームもあるみたい?ですね。

      ハンドガンは銃口の先とカメラの中心を合わせ、マシンガン等は銃口を合わせずカメラの中心を当たり判定とすると楽なんですかねぇ・・・。

      わたくしの場合はカメラ位置をハンドガンの銃口に合わせて対応しています(武器切り替え機能は作ってないので)。

      https://gametukurikata.com/fps/collisiondetection

      やり方は↑の記事でやっていますが、カメラの中央にImage画像を表示させ、カメラの位置(CameraPosition)を移動させて銃口をカメラの真ん中の位置に合わせています。

  3. midori より:

    ありがとうございます。

  4. midori より:

    FPSの手のモデル(銃のモデル)と 体の全体像モデル(相手から見た自分のモデル) の2つを用意すると思うのですが 2つを用意すると手が2つ表示される心配と 相手側からはFPSの手のモデルを 見えないようにするにはどうすればいいでしょうか

    • わたくしのFPSを作ってみようのカテゴリで作っているFPSですと手のモデルではなくキャラクターモデル(全身)の目の位置にカメラを持ってきているので、手のモデルと相手方から見た自身の全身を別個で用意する必要がありません。

      手のモデルと全身モデルを別個に作りたい場合は、自身の手のモデルは表示し相手の手のモデルを表示しないということですから単純にカメラのCulling Modeで切り替える事は出来ないかもしれませんね。
      (自身や相手の手のモデルにHandというレイヤーを設定し、これをCulling Maskで外すと自身のも相手のも見えなくなる)

      ユーザー対戦を想定していると思われるので、キャラクター毎の手のモデルのレイヤーにそれぞれHand1、Hand2等のレイヤーを設定し、プレイヤーのカメラのCulling Maskで自身の手のモデル以外のレイヤーを不可視に設定してみてはどうでしょうか?

      Player1はCameraのCulling MaskのHand1をチェックし、それ以外のHandはチェックを外す。

      Player2はCameraのCulling MaskのHand2をチェックし、それ以外のHandはチェックを外す。

      プレイヤーの数はある程度限られている場合はこれで問題はないような気がします。

      gameObject.layerでレイヤーの設定、カメラ.cullingMaskでカメラの描画対象レイヤーの設定が出来るので、スクリプトからでも操作出来るかもしれません。

      その他の方法はちょっとわかりません。