2016年1月23日土曜日

UnityのTerrainで作った世界にNavMeshを設定してうろつく


まずは、Terrainを使って土地を作ってみます。
これが完成図。

GameObject3D ObjectからTerrainを設置します。

Inspectorの歯車のマークから色々と設定を変更できます。

とりあえず今回マップは狭くていいので、下のほうのResolutionからサイズを変更します。

サイズの設定が終わったら、早速土地の形状を作成していきます。

歯車マーク並びの左端から三つめまでが形状を変化させるツールです。
左から、引き上げor引き下げ、高さ指定で引き上げor引き下げ、起伏を均すという三つのツールです。

どーん。

これだけだと石膏みたいなので、それっぽいテクスチャとかを用意したいところですが極めて面倒です。

そこで、標準で用意されているAssetがあるのでそれを使います。

AssetsImport PackageからEnvironmentを追加します。
※古いバージョンのUnityではTerrain Assetだった模様。

少し時間がかかりますが、インポートが終わったら筆マークを選択し、Edit Texturesからテクスチャを選択して貼っていきます。

何種類かのテクスチャを貼っていくと、絵心ゼロでもとりあえずそれっぽくなります。

次に筆マークの右側の木のマークから、木を生やします。

最後にもう一つ右側の花のようなマークから、草を生やします。

せっかく島っぽくしたので、海も作ってみましょう。

先ほどインポートしたStandard Assetsフォルダの中のEnvironmentフォルダにWaterフォルダがいくつかあるので、その中のPrefabsフォルダから適当に追加します。

追加された板のようなものが水面になるので、サイズと位置を適当に調節します。

ここまでやると、意外とそれっぽくなります。


次に、せっかくなのでAssetストアからUnityちゃんをインポートして歩かせてみます。

経路探索のアルゴリズムとかを一から実装するのはダルすぎるので、NavMeshの設定をします。

まず、TerrainをStaticにします。(デフォルトでなってました)

Inspectorの横当たりにNavigationというタブがあるので開きます。
無ければメニューのWindowからNavigationを選択すると開きます。

Navigationタブを開くと一番下にBakeというボタンがあるので押します。

歩ける部分が青く表示されます。

次にUnityちゃんのほうに、Nav Mesh Agentを追加します。

NavMeshAgentSetDestination()に位置を渡すと移動できるので、左クリックした場所に移動するようにスクリプトを追加します。

UnityちゃんのデフォルトのAnimator Controllerでは、速度によって歩くアニメーションとアイドルが切り替わるようになっていたのですが、面倒なのでbool値のパラメータwalkを追加しました。

RaycastHit hit;
Ray ray;

NavMeshAgent agent;
Animator animator;

void Start () {
 agent = GetComponent<NavMeshAgent>();
 animator = GetComponent<Animator>();
}

void Update () {
 if (Input.GetMouseButton(0)) {
  ray = Camera.main.ScreenPointToRay (Input.mousePosition);
  if (Physics.Raycast (ray, out hit, 1000)) {
   agent.SetDestination (hit.point);
   animator.SetBool ("walk", true);
  }
 }
 if (Vector3.Distance(hit.point, transform.position) < 1.0f) {
  animator.SetBool ("walk", false);
 }
}

ちゃんと障害物を迂回して歩いてくれました。

Read More...

2016年1月10日日曜日

Blender v2.76でアニメーションを作成しUnityへインポートする



前回、Unityへインポート可能なオブジェクトとRigを作ったので、今回はアニメーションを作成してみます。

まず、Blenderで作業します。
Rigを選択したらViewをDope Sheet、ModeをAction Editorに切り替え、Newをクリックします。

適当に名前をつけたら、横にあるFをクリックします。

これで準備は出来たので、3D ViewのPose Modeで走るアニメーションを作っていきます。

関節の角度から作成していくFKモードは少しめんどくさそうですし、自然な動きにならなそうなので、手足などの末端の位置に腕などが追従してくれるIKモードを利用します。

まず足首あたりにくっついているfoot.ik.Lを選択し、Rig Main PropertiesのFK / IKのところを1.0にします。
反対の足も同じように設定します。

Current Frameを1にして1フレーム目から作成していきます。
右側の赤い丸はAutomatic keyframeのオンオフで、オンにすると動かしたものは自動的に記録してくれるのでオンします。


まずは右横からの視点で、両足と腹部にあるtorsoの位置を調節しながら何フレームか作っていきます。
接地する部分はつま先の角度をいい感じに調節します。

ポーズはCtrl+Cでコピーし、Ctrl+Shift+Vで反転して貼り付けることが出来ます。
歩く、走るといった左右の繰り返しのようなアニメーションを作成する場合、一連のサイクルの半分を作成したら、後は前半部分を反転して貼り付けていくと楽です。

そういうアドオンもあるみたいです。

一連の動きが出来たら、次に正面からの視点に切り替えて、膝、足の位置や角度を調節します。
膝の角度は膝の先に浮かんでいるボールの方向を向くようです。

手についても同じように、手首の上あたりにあるhand.ik.Lを選択し、Rig Main PropertiesのFK / IKのところを1.0にします。

反対の手も同じように設定し、足の動きに合わせてポーズを作成していきます。
肘の角度は膝と同じように後ろに浮いているボールで調節します。

出来上がったらfbxでエクスポートします。
Animationを選択してエクスポートすれば動きました。

Unity側にインポートする際は、モデルをインポートしたときと同じく、Unityのインポート設定の部分で、RigのDEFボーンを駆逐する作業が必要です。

Rigの設定が終わったら、Animationのタブから、アニメーション名、開始終了フレームの設定や、Loop有無の設定などを行います。

モデルに反映してみたところ、ぎこちないですが動きました。



Read More...

2016年1月4日月曜日

Blender v2.76で作成したモデルをMecanim用に設定してUnityへインポートする


Blenderのバージョン違いなどにより、出回っているマニュアルっぽいのが役に立たなかったりするので、ハマったところを中心にメモ的に。


まずは適当にモデルデータを作成します。


Rigifyアドオンを有効にした上で、Shift + AからArmatureHuman(Meta-Rig)を選択し、Armatureを追加します。

オブジェクトモードでオブジェクトの位置、サイズをRigに大まかに合わせます。

Locationが0, 0, 0になるように、オブジェクトの原点をShift + Ctrl + Alt + Cで中心に置いた3Dカーソルに合わせます。
Scaleが1, 1, 1になるようにCtrl + AでScaleをリセットします。

ボーンを選択してEditモードに入り、Amature OptionsからX-Axis Mirrorをオンにしたうえでチマチマと位置合わせします。

骨がすべてうまいこと肉に収まったら、Rigify ButtonsGenerateからRigを生成します。


Objectモードに戻ってObjectを選択したあとにRigを追加で選択し、Ctrl + PWith Automatic Weightsを選択します。
この時点でモデルが消えたり、頭だけ残して消えたりするようであれば、User PreferencesFileタブにあるAuto Run Python Scriptsにチェックが入っていないと思われるので、チェックを入れた上で実行します。


これでモデルとRigが連動して変形するようになります。

WGTから始まるボーンが生成されますが、これは不要なようなのですべて削除します。

で、完成したと思ってfbxファイルにエクスポートしてUnityに取り込むと、かなりカオスな感じになります。

そのままだとUnityのMecanimで利用するには適切ではないボーンに紐づいているようで、Mecanim用に修正する必要があるようです。

公式っぽいところを見ると、「肩をDEF-shoulder.RDEF-shoulder.Lにスキニングして、親がORG-ribsであることを確認します。」と出てくるのですが、ORG-ribsなんてのは見つかりません。

どうやら、Blenderのバージョンが新しいとボーンの命名規則が変わっているようで、上記の手順は通用しないようです。

基本的にはDEFから始まるボーンではなく、ORGから始まるボーンを利用するということのようです。
確かに見てみるとDEFから始まるボーンは関節が人間の倍ぐらいあります。ぐにゃぐにゃするわけですね。

で、いくつかやり方はありそうですが、この動画を参考にやってみたところうまくいったので残しておきます。

流れとしてはDEFボーンをすべてORGボーンの子にしてしまう感じです。


まず、Rigを選択して、一番右下と右から3番目のレイヤーを表示します。

EditモードでDEF-hipsを選択し、Shiftを押しながらもう一度選択するとORG-hipsが選択されます。
重なっているので両レイヤーが有効になっていると区別出来なそうです。

それぞれのボーンを選択したら、Ctrl+PKeep Offsetを選択します。
これで後から選択したボーンが親になります。

以下5組のボーンに対して同じ作業で親子関係を正します。

DEF-hips ORG-hips
DEF-spine ORG-spine
DEF-chest ORG-chest
DEF-neck ORG-neck
DEF-head ORG-head


腕、脚、指にもORGボーン一本につきDEFのボーンが二本あります。

DEFボーン二つを選択した後にORGボーンを選択し、同じくKeep Offsetで親子にします。
複数選択した場合は、すべてが最後に選択したボーンの子になるようです。

以下腕4組、脚4組、指10組と結構あります。

DEF-upper_arm.01.R DEF-upper_arm.02.R ORG-upper_arm.R
DEF-forearm.01.R DEF-forearm.02.R ORG-forearm.R

DEF-upper_arm.01.L DEF-upper_arm.02.L ORG-upper_arm.L
DEF-forearm.01.L DEF-forearm.02.L ORG-forearm.L

DEF-thigh.01.R DEF-thigh.02.R ORG-thigh.R
DEF-shin.01.R DEF-shin.02.R ORG-shin.R

DEF-thigh.01.L DEF-thigh.02.L ORG-thigh.L
DEF-shin.01.L DEF-shin.02.L ORG-shin.L

DEF-f_pinky.01.R.01 DEF-f_pinky.01.R.02 ORG-f_pinky.01.R
DEF-f_ring.01.R.01 DEF-f_ring.01.R.02 ORG-f_ring.01.R
DEF-f_middle.01.R.01 DEF-f_middle.01.R.02 ORG-f_middle.01.R
DEF-f_index.01.R.01 DEF-f_index.01.R.02 ORG-f_index.01.R
DEF-thumb.01.R.01 DEF-thumb.01.R.02 ORG-thumb.01.R

DEF-f_pinky.01.L.01 DEF-f_pinky.01.L.02 ORG-f_pinky.01.L
DEF-f_ring.01.L.01 DEF-f_ring.01.L.02 ORG-f_ring.01.L
DEF-f_middle.01.L.01 DEF-f_middle.01.L.02 ORG-f_middle.01.L
DEF-f_index.01.L.01 DEF-f_index.01.L.02 ORG-f_index.01.L
DEF-thumb.01.L.01 DEF-thumb.01.L.02 ORG-thumb.01.L


これでUnityのMecanim用のボーンの設定は完了です。
FBXでエクスポートして動作を確認してみます。

エクスポートする際は、オプションでSelected Objectsをチェックし、Forward-Z ForwardからZ Forwardに変更します。
BlenderとUnityで座標系が異なるので、ここで合わせておくそうです。

ArmatMeshをオンにしてエクスポートします。

吐き出したfbxファイルをUnityに読み込ませ、RigタブのAnimation TypeHumanoidに設定し、Configureをクリックします。

オールグリーンになりますが、あと一歩です。

BodyにあるToesの二箇所が、DEF-toe.LDEF-toe.RでDEFになっているのでORGに変更します。

HeadにあるHeadが、DEF-headになっているのでORG-headに変更します。

Left HandRight HandそれぞれにあるDistalが、すべてDEFになっているのでORGに変更します。
ちなみに、DistalのDEFになっているボーンはすべて02になって重複していたので、03を選択します。

これでDEFの駆逐が完全に完了し、設定終了です。

最後にMecanim Locomotion Starter Kitを使って動かしてみます。

元のモデルがアレなんで微妙ですが、多関節のクリーチャーみたいなのからは脱却出来ました。



Read More...