おもちゃラボ

Unityで遊びを作ってます

【Unity】Blenderで人型のボーンを入れて、Animatorで走るアニメを再生する

人型の3Dモデルにボーンを入れるのは、手作業でやると結構大変です。Blenderにはアーマチュアと呼ばれる人型のボーンが用意されており、これを使えば簡単に人型のボーンを入れることが出来るようになります。

f:id:nn_hokuson:20170420201957j:plain

簡単なはず・・・なのですが、最初にやろうとすると手順が多くて大変だったりします(笑)この記事では、ハマリポイントも合わせて、ボーンの入れ方からUnityのAnimatorで動かすまでの流れを説明します。

Rigfyを使わずにボーンを入れる手順はこちらの記事で説明しているので、スクラッチでボーンを入れたい方はあわせて参考にして下さい。
nn-hokuson.hatenablog.com

Rigifyの有効化

まずはRigifyが使えるようにAddonを有効化します。
メニューバーから「ファイル」→「ユーザー設定」→「アドオン」と選択し、「Rigging:Rigify」の右側のチェックボックスにチェックを入れてください。

f:id:nn_hokuson:20170420194705p:plain:w400

アーマチュアの設定

自分の作成したモデルをロードし、人型のアーマチュアを設定しましょう。「Shift+A」→「アーマチュア」→「Human」を選択して下さい。

f:id:nn_hokuson:20170420194720p:plain:w400

すると、下図のような人型のボーンが作られます。

f:id:nn_hokuson:20170420194725p:plain:w450

この人形のボーンをmeta rigといいます。これを自分の作った3Dモデルにフィットするように移動・回転・拡大縮小してください。

f:id:nn_hokuson:20170420194757p:plain:w450

注意:メタリグはポーズモードではなく、編集モードで編集してください

モデルとリグを関連付けましょう。「モデル→「リグ」の順番に選択して、「Ctrl+P」で「自動のウエイト」を選択します。順番が大切です!

f:id:nn_hokuson:20170420194841g:plain

これで、リグを動かすとモデルも動くようになりました!(おい・・・)

f:id:nn_hokuson:20170420201537g:plain

ちなみに、「自動のウエイト」を選択したときに「ボーンヒートウェイト:一つ以上のボーンで解決に失敗しました」というエラーが出ることがあります。その場合は次の記事を参考にしてみて下さい。

nn-hokuson.hatenablog.com

Blenderで書き出しUnityにインポートする

Blenderで作ったモデルをUnityにインポートしましょう。メニューから「ファイル」→「エクスポート」→「fbx」を選択します。

f:id:nn_hokuson:20170420194917p:plain:w400

続いて作成したfbxファイルをUnityにドラッグ&ドロップしてインポートします。
インスペクタから「Rig」→「Animation Type」を「Humanoid」に設定して「Apply」ボタンを押してください。

f:id:nn_hokuson:20170420194926g:plain

configureボタンを押して正しくボーンが対応付けられているかを確認します。全身が緑色のおじさんになっていたら成功です。

f:id:nn_hokuson:20170420194952p:plain:w200

緑色のおじさんの右上のタブ「Muscles&Settings」を押すと、正しくボーンが設定されているかをアニメーションとともに確認することができます。

f:id:nn_hokuson:20170420195007g:plain

Animatorでアニメーションを再生する

今回のアニメーションはUnity-chanについてくるアニメーションを利用しましょう。ジャンプや走りなど一通りのアニメーションが揃っているため便利です。ユニティちゃんのアセットはこちらからインポートしてください。
f:id:nn_hokuson:20170420200539j:plain:w500

作成した人形のファイルをシーンビューに配置します。続けて、プロジェクトビューで右クリックし「Create」→「Animator Controller」を選択してManControllerを作成します。作成したAnimator ControllerをAnimatorコンポーネントにセットしてください。

f:id:nn_hokuson:20170420195349j:plain:w550

続いて今作ったAnimatorを編集していきます。ダブルクリックするとAnimatorエディタが開くので、走るアニメーション用に新しいステートを作ります。右クリックで「Create State」→「Empty」を選択してください。

f:id:nn_hokuson:20170420195118p:plain:w350

作成したNew Stateのパラメータをインスペクタから設定します。名前をRunに変更し、Motionの欄は「RUN00_F」を選択します。このRUN00_Fがユニティちゃんのアセットに含まれているアニメーションファイルです。

f:id:nn_hokuson:20170420195127p:plain:w250

再生ボタンを押すと、モデルが走りだしました!

f:id:nn_hokuson:20170420195135g:plain

まとめ

最初は、ものすごく長い工程に感じるかもしれませんが、実際には次の3工程を行っているだけです。

  1. Blenderでボーンを入れる
  2. Unityでボーンを認識させる
  3. Animatorの設定をする

慣れれば簡単なのですぐにできるようになりますよ☆

[asin:B091KQFSRC:detail]

【Arduino】プリン・ア・ラートを作る

プリン・ア・ラ・モードじゃないですよ、プリン・ア・ラートです。プリン・ア・ラ・モードを知らないという人のために解説すると、プリンのまわりにフルーツとか生クリームとかさくらんぼとか全部のせしたスイーツのことです。

f:id:nn_hokuson:20170418203427j:plain:w400

いいですね、プリン。いいですね、生クリーム。ただ、今回のプリン・ア・ラートとは全然全く何の関係もありません。


で、プリン・ア・ラートとは何かというと・・・


プリンって冷蔵庫に入れておくといつの間にか消えているじゃないですか。そりゃあ、冷蔵庫に8万個ぐらいプリンが入ってたら別に1つくらい消えてもいいですよ。でも1個しかないプリンが消えるんです。これは事故じゃなくて事件ですよ、悪い奴らは全員逮捕ですよ。


 プリンラバーとしてプリンがみすみす目の前から消えていくのを黙っている訳にはいきません。ほら、地球の森林と同じですよ。誰かが何とかしなくちゃいけないんです。砂漠になってからでは遅いんですよ。


そういうわけで、プリンが消えてしまう前にアラートを鳴らしてくれるシステムを作りました。その名前がプリン・ア・ラート。こんな感じで動きます。


www.youtube.com


プリンにスプーンを差し込んだ瞬間に、それを検知してアラートを鳴らします。このシステムさえあれば一斉検挙、一網打尽ですよ。

「いまポッケに隠したものを出しなさい、この液をかけて青色に変わったらプリンだからね」
「・・・」
「ほら、青色に変わった。(ドヤ顔で)じゃあプリン所持の容疑で現行犯逮捕するよ」

なんて会話が年末ぐらいに放送されるかもしれません。

プリン・ア・ラートの作り方

プリン・ア・ラートはArduinoと抵抗、スプーン、あと美味しいプリンがあれば簡単に作ることが出来ます。

基本的な技術はこちらで紹介した静電式タッチセンサです。


nn-hokuson.hatenablog.com


タッチセンサの先端をプリンに指しておくと、スプーンが差し込まれたタイミングで「タッチセンサ」→「プリン」→「スプーン」→「犯人」というパスでキャパシタが生成されて、タッチが検出されます。


f:id:nn_hokuson:20170418215807p:plain


タッチが検出されたタイミングでArduinoからMacへシリアル通信でデータを送信しています。受け側はUnityです。Processingでも良いのですが、mp4ファイルの再生ができなかったので・・・ArduinoとUnityの通信についてはこちらの記事に書きました。


nn-hokuson.hatenablog.com


動画の再生にはUnity 5.6で提供されているVideoPlayerを使っています。エヴァ風のアラート画像はこちらからお借りしました。


www.youtube.com


私の場合、消えたのはプリンでしたが、どうやら世の中にはチーズが消える人もいるようです。

【Unity】実行中にインスペクタで変更した値を停止後に反映させる方法

Unityではゲームを実行しているときにインスペクタから入力した値は、実行終了後にはもとに戻るようにできています。ゲーム実行中にオブジェクトの位置を少し変えてみたり、ライトの方向を少し変えてみたりと実験するのにはとても便利です。

でも、実験して気に入った修正でも、停止ボタンを押すと否応なく消されてしまいます。それが嫌ならスクリーンショットでも撮っておくしかない・・・

江戸時代ならまだしも、いまは2017年なんです。飛行機は空を飛び、人はバーチャル空間で遊び、ケモノはフレンズになったんです。スクリーンショットを撮っている場合ではないのです。

f:id:nn_hokuson:20170417184259p:plain:w500

なので、いい方法がないか探していた所・・・
テラシュールブログさんにこんな記事が!

tsubakit1.hateblo.jp

この方法で確かに変更した値は保存できるのですが、ちょっとだけ手間がかかりますね。ということで、他に方法がないかとインスペクタを触ってみると・・・あるじゃないですか!

インスペクタの歯車を押すと表示されるドロップダウンメニューの中に「Copy Component」という項目があります。ゲーム実行中にインスペクタから値を調整した後、この「Copy Component」を選択します。

f:id:nn_hokuson:20170417183825j:plain

ゲームを停止すると、インスペクタの値は一旦もとの値に戻ってしまいますが、ここで再度歯車ボタンから「Paste Component Values」を押してください。

f:id:nn_hokuson:20170417183844j:plain

すると、ゲーム実行時にコピーした値がまるっとコピーされます!めっちゃ便利!これがやりたかった!さすが平成!解決方法もスマートですね。