スポンサーリンク

Unity実習13、キャラクターを動かしてみる

やって行きましょう

まずはCharacter Controllerのセットアップ
ヒヨコの時にも、たしかこれ使いましたね、これを使えば

・地形の凹凸に沿って移動
・壁にこするように沿って移動
・登れる坂道の勾配を制限
・登れる階段の段の高さを制限

といったことが可能です

Playerを配置
Projectビューで Assets/3D Assets/Playerにある Player をSceneビューに直接ドラッグ&ドロップ
好きな位置に置けるので、見やすい場所がいいかも
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_15-0-21_No-00

設置したら
PlayerのInspectorで Add Component > Physics と進み、 Character Controller を選択します
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_15-2-52_No-00

Sloop Limit の値を 20
Min Move Distanceは本では指定されてませんが、写真で0になっているので0に
Center の Y座標 を 1 に
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_15-21-50_No-00

ちなみに、それぞれどんな効果のあるものなのかというと

Slope Limit: 登れる坂の勾配
Step Offset: 乗り越えられる段差の高さ
Skin Width: 他の衝突物と接触した際にめり込んでもかまわない幅(Radiusの10%くらいがいいらしい)
Center: 衝突範囲のカプセル形状の中心位置
Radius: 衝突範囲のカプセル形状の半径
Height: 衝突範囲のカプセル形状の高さ

色々決められるんですねぇ

Character Controllerをスクリプトで制御
まず、本に「こんなスクリプトです」、といった事が書かれているので引用

キャラクターの目的地の座標をdestinationという変数とします。そして、キャラクターを目的地に向かって移動させるには、目的地方向の1フレーム分の移動量を求めて現在地に加算していけばよいのです。1フレーム分の移動量は方向と速度さえわかれば方向×速度×1フレーム分の時間で求められますので、まず速度と方向を掛け合わせたベクトルvelocityを求めましょう。そして移動を繰り返せばいずれ目的地に到着します。十分に目的地に近づいたら移動終了です。


...ほう...?
まぁ、やれば分かります、きっと

まず、ProjectのAssetsフォルダの中に Scripts というフォルダーを作成します
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_15-33-59_No-00

その中にサンプルデータの中に入っているスクリプトをドラッグ&ドロップ
場所は、UNIDRA_DATA/Data/MainGame/Scripts/Chapter5 の中にあります
SnapCrab_Chapter5_2016-5-27_15-34-18_No-00.png

Projectに入れたら、PlayerのInspectorの下の部分、Add Component の下辺りにドラッグ&ドロップ
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_15-59-32_No-00

次は試しに動かしてみればいいのですが、その前にスクリプトの解説があるので
ノートとる代わりにブログに書いていきます

移動についての考え方
プレイヤーを目的地まで移動させるのに必要な情報
・目的地の方向(位置)
・プレイヤーの移動速度

毎フレーム移動させればいずれは到着する
とりあえず、地面の凹凸などを考えずに考える

方向ベクトル = (目的地の位置 - 現在地)/目的地までの距離

移動速度ベクトル = 方向ベクトル × 移動速度

1フレームの移動量 = 移動速度ベクトル × 1フレームの時間

新しい位置 = 現在地 + 1フレームの移動量

毎フレームごとにこの計算をすれば移動していく

移動を滑らかにするには?
今のままだと等速運動のようになっているので、「動き出す時は徐々に加速、止まるときは徐々にゆっくりになり停止」させたい
なので式に補完する
「1/3秒で目的の速度になる」ようにするには、

t = 1フレームの時間 × 3
ただし、t > 1 の時は t = 1

として、

移動速度ベクトル = (方向 × 移動速度)× t + 現在の移動速度ベクトル ×(1 - t)

出てきた単語情報まとめ
・現在地
・目的地の位置
・目的地までの距離
・方向ベクトル
・移動速度
・移動速度ベクトル
・1フレームの時間
・1フレームの移動量
・新しい位置
・t


カチカチの脳みそにはきついですね...
で、これだけだと地面を貫通したり空中を浮いたりしながら、一直線にすすむだけになってしまいます
が、Unity君賢い!Character Controller にはMove関数なるものがあって
凹凸による移動時の距離の違いだのなんだのを計算してくれるそうです
ただし今回は、重力で下に引っ張る力を付け加えているそうな
(坂を登るときは遅くなって、下るときは早く?)
なので、 水平の移動量 + 重力分の移動量
を求めて、後はMove関数にぶん投げる、といったスタイル

この後、スクリプトがどんな処理をしているのか書かれていますが
非常に難しい
説明できないので見出しだけ書いておきますと
・コンポーネントの取得とキャッシュ
・接地判定
・目的地への方向を求める
・到着判定
・移動速度ベクトルを求める
・スムーズに補間
・重力加速
・CharacterControllerで移動させる
・移動方向に向かせる
・指定方向に向かせる
・設定関数の用意
色々やっているみたいですねぇ

移動をテストする
まずは、プレイヤーを適切な位置に移動させます
PlayerのInspectorでPositionを(X: 50,Y: 0,Z: -40)に設定
Main CameraのPositionを(X: 50,Y: 1.5,Z: -45)に設定
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_17-21-16_No-00

もしも、キャラクターを見失った場合は、HierarchyでPlayerをダブルクリックしましょう
そうすれば、キャラクターの近くにSceneビューが移動します

準備ができたらゲームのテストプレイを開始
テストプレイ中にPlayerのInspectorでスクリプトのDestinationの数値を変えてみましょう
XとZ、どちらでも構いません
変更したら、Arrivedのチェックを外します
すると、キャラクターが移動を開始
SnapCrab_Unity Personal (64bit) - GameSceneunity - UNIDRA - PC Mac Linux Standalone DX11_2016-5-27_17-25-14_No-00
関連記事

Leave a Reply


管理者にだけ表示を許可する

Comment

Leave a Reply


管理者にだけ表示を許可する