Nanashi-soft

Nanashi-softの活動状況とか雑談です。 Unity3Dでゲーム作っています。

つづき)

前回で,ユニティちゃんと同じアニメーションができるようにしました
実際にアニメをさせるには,Animatorの Playでステート名を記述する事で可能です
1.Tasks→Actions→Animator→Playを追加
※注意:Animationにも同じ Playがあるので綴りを間違えないように選択する
2.Playの Inspectorの,Target Game Objectに親のオブジェクトをドロップ(正確には Animatorがセットされているオブジェクトです)
State Nameに Locomotionとセット(Animator上のステートメントの文字列です)
3.その Playを Sequenceの下に繋げて,Look Atと Move Towardsの間に入れる
これで,見る→アニメする→移動するの一連の動作が行われるはずです

実行して見ると,確かにアニメするのですが,なんか変な挙動です(ぁ
片足を前に出して,脚を揃えて,また同じ方の足を前に出します(笑)
ああ,アニメを指示する度に頭から再生しているわけね(*'-')

これを解消する方法を色々と模索しましたが,結局かなり複雑な方法をとるしかなく
また,考え方そのものからやり直す必要があるように感じました
animator_variables
変数は,PlayerPosに操作キャラ,CharPosに呼び寄せたいキャラのTransform.Positionをリアルタイム反映しています
animator_repeator
animator_selector
animator_withindistance
animator_lookat
animator_play
animator_movetowards


今は棒立ちでこっちに移動して来るわけですが,ちゃんと歩行モーションさせたいです(願望
アニメーターに指示を送ればできるはずです

その前に,こっちを向く処理をススッと追加しておきます
1.Tasks→Actions→Basic→Transform→Look Atを追加
2.Look Atの Inspectorで,World Positionの黒丸ボタン→PlayerPos
3.Tasks→Composites→Sequenceを追加
4.Selectorと Move Towardsの間に,Sequenceを入れる
5.Sequenceの下に Look Atをくっつけて,Move Towardsの左に置く
Sequenceを追加して,一連の移動動作をそこにまとめて記述するようにしました
そこに,歩行モーションを追加したいわけです

その前に,まずは前提条件として,ユニティちゃんアセットの上に呼び寄せたいキャラも乗っている状態を作ります
1.unitychanオブジェクトをクリックして,Unityメニューの Edit→Duplicate
2.親の Inspectorの Unity Chan Control Script With Rigid Body (Script)を右クリックして Remove Componentする
3.子にあるユニティちゃんモデルオブジェクトを右クリックして Deleteする
Main Cameraも Deleteする
※〇〇Posだけ残す
4.表示したいキャラのモデルデータを,子にドロップする
※ここでいうモデルデータとは,Projectで,クリックすると Inspectorがモデルデータ表示になるものです。また,Rigの Animarion Typeが Humanoidになっている必要があります
5.モデルデータの Inspector→Transformを,Position(0,0,0),Rotation(0,0,0),Scaleはユニティちゃんと同じぐらいの大きさになるように調整して下さい
6.親の Inspectorの Animator→Avatarに,モデルデータの Avatarデータを設定する
※Avatarデータとは,モデルデータの Animarion Typeが Humanoidになっている場合に自動生成されます。Project上のモデルデータの子辺りを探してみて下さい
これで,呼び寄せたいキャラも,ユニティちゃんと同じ動作ができるようになったはずです

これに,先程までの,Behavior Treeデータをコピーして来ます
1.元のキャラオブジェクトにある Behavior Tree (Script)を右クリックして,Copy Component
2.新しく作った親の Inspector→Transform上で右クリックして,Paste Component As New
3.追加した Behavior Tree (script)の Openボタンをクリック
4.Variablesに既にある CharaPosの右にある三角をクリックして,親オブジェクト→Transform→Position
これで同じ動作をするようになるはずです

つづく)

では,実践でやっていたキャラ移動を書き直します
全部削除して最初からやり直しますよ('-'*)

以前設置した指標とするオブジェクトや,キャラに追加した Behavior Tree (Script)などを全て削除する ←

代わりに,操作キャラから一定距離以上離れたら,操作キャラに向かって移動する
と言う処理を作ります

〇操作キャラに向かってくる
以前できなかったヤツです。前回やった目標物に向かって移動する処理を行えば可能です
一定距離以上離れたら,こっちに向かってくる。というのを作ります
1.ついてこさせたいキャラのオブジェクトをクリックして,Unityメニューの Tools→Behavior Designer→Editorを選択
2.右クリック→Add Behavior Treeを選択して生成
3.Tasksタブ→Decorators→Repeaterを追加し,Inspectorタブ→Repeat Foreverにチェック

ここまでは定型です
まずは,座標変数を作っていきます
4.Variablesタブ,Nameに PlayerPos,Typeに Vector3で Addボタン
PlayerPosの右の三角ボタンをクリックして,unitychan→Transform→Positionを選択
※unitychan部分は,操作キャラのオブジェクトを各自選択して下さい
5.同様に,Nameに CharaPos,Typeに Vector3で Addボタン
PlayerPosの右の三角ボタンをクリックして,satomi→Transform→Positionを選択
※satomi部分は,呼び寄せたいキャラのオブジェクトを各自選択して下さい

次に,一定距離離れたら,というのは以前設置した,Selectorと Within Distanceを使った
2オブジェクトが一定距離内にいると何もしない,判定を使います
6.Tasksタブ→Composites→Selectorを追加
7.Repeaterの下に,Selectorをくっつける
8.Tasksタブ→Conditions→Common→Within Distanceを追加
9.Within Distanceの Inspectorタブで,Magnitudeを 1,Targets→Sizeに 1をセットして,Element 0に操作キャラのオブジェクトをドロップする
10.Selectorの下に,Within Distanceをくっつける

次に,本命の操作キャラの方に移動する処理を追加します
11.Tasks→Actions→Basic→Vector3→Move Towardsを追加
12.Move Towardsの Inspectorで,Current Positionの右の黒丸ボタン→CharaPosを選択
Target Positionの右の黒丸ボタン→PlayerPosを選択
Speedに 1を設定
Store Resultに CharaPosを選択
13.Selectorの下に,Move Towardsをくっつけて,Within Distanceの右側に置く
これで,実行すると,ずずずーっと近づいてきます
どの方向に移動しても,周囲一定の距離に移動して来て止まります
MoveTowards_variables
変数は,PlayerPosに操作キャラ,CharPosに呼び寄せたいキャラのTransform.Positionをリアルタイム反映しています
MoveTowards_repeater
MoveTowards_selector
MoveTowards_withindistance
MoveTowards_movetowards

以前は変数の使い方がわからなかったのでできなかったのですが,Unityなら Vector3.MoveTowardsを使えば可能なはずです
BehaviorDesignerだと,Tasks→Actions→Basic→Vector3→Move Towardsです

先程のキューブに,そのまま前進していって貰いましょう
1.Repeaterの下には 1コしかくっつけられないので,Tasks→Composites→Sequenceを追加して,Repeaterと Look Atの間に入れる
2.Tasks→Actions→Basic→Vector3→Move Towardsを追加
3.Look Atを左に,Move Towardを右にくっつける
4.Variablesで Name:CubePosを Type:Vector3で Add
5.CubePosの右の三角をクリック→Cube→Transform→Positionを選択
6.Move Towardsの Inspector→Current Positionの右の黒丸ボタン→CubePosを選択
Target Positionの右の黒丸ボタン→SpherePosを選択
Store Resultに CubePosを選択
これで実行すると,球に向かってキューブが動いて行きます
ちなみに Cubeに Rigidbodyを追加すると面白い事になります('-'*)
オブジェクトの方を向かせる
lookat変数
この変数の見た目ではわかりませんが,SpherePosにはSphereオブジェクトの座標が,CubePosにはCubeオブジェクトの座標がリアルタイムに反映されるように設定しています
lookat_repeater
lookat_sequence
lookat_lookat
lookat_movetowards

こっちに近づいて来るのはいいのだが,全くあさっての方を向いている
Unityを使っている人はすぐにわかることだが,あるオブジェクトに向かせるのは Transform.LookAtに決まっている
Behavior Designerにも当然ある。Tasks→Actions→Basic→Transform→Look At
これの Inspectorを見ると,World Positionに値を設定すると,そのオブジェクトを見ることがわかる
問題は,そこにどうやってユニティちゃんの位置座標を入力すればいいのか?

きっと Variables(変数を扱う機能)をどうにかするのだろうと当たりを付ける
試行錯誤の結果,変数を扱う方法がわかった
変数が使えるのであれば,前回までのアフォみたいな事をしなくても,色々できるよ('-'*)

〇変数の宣言と使い方の基礎
グローバル変数と,ローカル変数がきちんとあります
・グローバル変数
Unityメニューの Tools→Behavior Designer→Global Variablesでダイアログ表示できます
・ローカル変数
Behavior Tree毎に,上の Variablesタブで表示できます

変数宣言の方法は,Nameに変数名を入れて,Typeで型を選択して,Addボタンです
そうすると,下に変数が追加されます
その値の右にある三角をクリックすると,オブジェクト一覧が表示され,現在の型で設定可能なインスペクタ上の項目が一覧表示されます
ここで選択した項目と関連付けされます ←ここ重要

この関連付けが行われることで,値の取得はもちろん,反映も行う事ができます

使い方は,Behavior Treeのノードをクリックして,Inspectorを表示
値をセットするインプットボックスの右に黒丸ボタンがあるのをクリックする
そうするとプルダウン表示になるので,そこに設定可能な型の変数が一覧表示されるので,選択します

こうして,オブジェクトのインスペクタの値を取得して,判定し,反映する事ができるようになります

〇Look Atで特定のオブジェクトの方を向かせる
あえて,それだけのことをさせて,変数の使い方が合っているか確かめてみます

1.Unityメニューの GameObject→3D Object→Cubeを追加(球とかだと向きが変わってもわからないからw)
2.Unityメニューの Tools→Behavior Designer→Editorを選択
3.右クリック→Add Behavior Tree
4.Variablesタブで,Nameに SpherePos,Typeに Vector3を選択して,Addボタン
5.SpherePosの座標の右にある三角ボタンをクリック→Sphere→Transform→Positionを選択
6.Tasks→Decorators→Repeaterを追加
7.追加した Repeaterの Inspector→Repeat Foreverにチェック
8.Tasks→Actions→Basic→Transform→Look Atを追加
9.追加した Look Atの Inspector→World Positionの黒丸ボタンをクリック→プルダウンで SpherePosを選択
10.Repeaterの下にくっつける
これを実行すると,落下する球体を追う立方体が見て取れます

↑このページのトップヘ