あさりのみそしるダイアリー

ブラック社員がお届けする一貫しないネタの数々・・・おあがりよ!

Hello Unity その3~キャラクターをキーボードで操作してみる~

「湯の花が多い時って・・・」


へしがないまま、継続します。

プログラムを1文字も書くことなく、3Dのステージや、好きなオブジェクトの追加をすることができました。
もうこれだけでも十分素敵な気がしますが、動かないものを見ても仕方がない・・・。

ここで動きを追加することで、ゲームとしてのクオリティを格段に高めることができます。




まずは、いつもどおり、Unityエディターを起動して、プロジェクト「HelloUnity1」を開いてください。


イメージ 2

操作したいキャラクターの名前を、わかりやすく「Player」にしましょう。
この青いキャラクターを、キーボードで操作します。



イメージ 1

続いて、メニュー「Assets」>「Create」から「C# Script」を選択してください。



イメージ 3

C#スクリプトの名前は「PlayerBehavior」にしました。
プレイヤーのふるまいをここに書いていきます。

・・・っと、右側にプログラムが。このプログラムは、テンプレートとして自動的に入るものです。

ここから、とうとうプログラミングの要素が入ってきます。

「PlayerBehavior」をダブルクリックしてください。



イメージ 4

すると、VS2017が起動し、選択した「PlayerBehavior.cs」が開かれた状態になります。

C#の話はここでは詳しく触れませんが、キャラクターの初期化時にStartメソッドが呼び出され、その後、毎フレーム更新ごとにUpdateメソッドが呼ばれるようです。



イメージ 5

Updateメソッド内に、キーボードのカーソルキー↑・←・→を押したときの動作を記述します。


        if (Input.GetKey("up"))
        {
            transform.position += transform.forward;
        }
        if (Input.GetKey("right"))
        {
            transform.Rotate(0, 10, 0);
        }
        if (Input.GetKey("left"))
        {
            transform.Rotate(0, -10, 0);
        }


Input.GetKey("キー名")で、キー入力イベントの取得
transform.position は、キャラクターの現在位置(座標)
transform.forward は、キャラクターの向いている方向
transform.Rotate(X,Y,Z) は、キャラクターを指定方向に回転

を意味します。

上記コードでは、↑キーでキャラクターの進行方向に移動
左右キーでキャラクターの向きをY軸に対して右ねじを回す方向に10° / -10°だけ回転します。

Y軸が上を向いている(Y-up)ので、床と水平方向の回転はY軸に対して行います。


Updateメソッドは毎フレーム通るので、ここにコードをどんどん追加していけば、そのままそれらのコードも実行されます。

コードを書き終えたら上書き保存します。



イメージ 6

上書き保存してUnityエディターに戻ると、右側のスクリプトが更新されます。

画面下部で改行コードがうんぬんと警告が出ていますが、無視してかまいません。



イメージ 7

そしたらスクリプトを、操作したいキャラクターにドラッグ&ドロップします。

キャラクターを選択すると、右側のInspector欄の下部に「Player Behavior (Script)」が追加されていますよね。念のため確認して下さい。

ちなみに、このスクリプトは、別にPlayerオブジェクトだけに通用するものではなく、このスクリプトをドラッグ&ドロップして適用されたすべてのオブジェクトについて適用されます。
キーボード操作をすると、このスクリプトが適用されたすべてのオブジェクトが動きます。



イメージ 8

では、実際に動作を確認してみましょう。

画面上部の真ん中に、再生ボタン、一時停止ボタン・・・がありますよね。
再生ボタンをクリックしてください。青い表示になりますよね。

この状態で、キーボードのカーソルキーを押してみてください。
キャラクターが動きましたよね!

(動かない場合は、カメラ画面上のどこかをクリックしてから、もう一度キーボードのカーソルキーを操作してみてください。)

なお、今の状態では物理特性は割り当てられていないので、あたり判定もなく、壁は通り抜け、段差からも落ちません。




イメージ 9

一通り試し終えたら、もう一度再生ボタンを押してください。画面が再生直前の状態に戻ります。

なお、再生中にオブジェクトに対して変更を行っても、再生を終了すると元に戻ってしまいますので、注意してください。



ついでに、FPSみたいにプレイヤーの視点でカメラが動くようにしてみましょう。

イメージ 10

イメージ 11

Hierarchyタブから、項目「Main Camera」を選択し、項目「Player」の上にドラッグ&ドロップします。
すると、Main CameraはPlayerの階層の下に移動します。


イメージ 12

続いて、カメラの位置を移動して、プレイヤーオブジェクトの後ろに来るようにします。
カメラの移動方法は、前々回に書いた通り、オブジェクトの移動・回転と同じです。



イメージ 13

カメラ位置を移動しました。
ただ、視線がびみょー。。。



イメージ 14

こういうのは数値をいじる方がうまくやれます。
Main CameraはPlayerオブジェクトの下に入ったので、右側のInspectorタブにあるMain CameraのTransforms値は、Playerに対する相対座標になります。


イメージ 15

値を
Position X:0 Y:120 Z:-100
Rotation X:0 Y:0 Z:0
に修正しました。

いい感じの視線になりましたね。

この場合、Playerオブジェクトの中心座標からY軸方向に120, Z軸方向に-100移動した場所が、Main Cameraの中心座標になります。
カメラは回転していないので、Playerオブジェクトと同じ方向を見ることになります。


これで、Playerをキーボード操作すると、カメラもそれに追随して動くようになりました。
再生ボタンを押して、試してみてください。



今回はここまで。シーンは上書き保存してくださいね。
次はオブジェクトの当たり判定について、物理演算を用いて試してみましょう!