03 %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88 - ruccho/first-step-to-unity GitHub Wiki
さて、玉転がしは玉とステージの基盤ができました。次は玉を操作できるようにしてみましょう。
Sphereに「キーボードで操作される」振る舞いを与えたいですね。前節で説明したGameObjectとコンポーネントの関係を考えると、「キーボードで操作される」機能を持ったコンポーネントを取り付ける必要がありそうです。
……しかし実は、Unityでは標準でそのようなコンポーネントは実装されていません。それではどうするのかというと、コンポーネントを自分で作る必要があります。
コンポーネントを作るには、スクリプトを記述する必要があります。スクリプト、つまりプログラミングの出番です。
Projectウィンドウの適当なフォルダで右クリックし、Create
> C# Script
を選択します。
スクリプトの名前の入力を求められるので、Ball
とでもしておきましょう。
作成したスクリプトをダブルクリックすると、編集することができます。
テンプレートが表示されるので、以下のように編集してみます。忘れずに保存をしておいてください。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Ball : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//----ここから追加----
void FixedUpdate()
{
GetComponent<Rigidbody>().AddForce(new Vector3(10, 0, 0));
}
//---- ここまで ----
}
コードの意味は置いといて、ひとまず動かしてみましょう。 Unityに戻り、作成したスクリプトをSphereのInspectorにドラッグ&ドロップすると……
これで作成したBallコンポーネントがSphereに取り付けられました。
このままPlayしてみると……?
あれ~~~~
ボールが一直線にステージ外へ! さきほど編集したコードを見てみましょう。
//ゲームの実行中、0.02秒間隔で実行される
void FixedUpdate()
{
//GetComponentでRigidbodyコンポーネントを取得し、AddForceで右方向へ力を加える
GetComponent<Rigidbody>().AddForce(new Vector3(10, 0, 0));
}
スクリプトにFixedUpdate()
というメソッドを記述すると、その内容は0.02秒間隔で繰り返し実行されます。
GetComponent<Rigidbody>()
は、このスクリプトが取り付けられているGameObjectからRigidbody
コンポーネントを取得できるメソッドです。Rigidbodyは物体の物理的な挙動をおこなうコンポーネントでしたね。
次にAddForce()
メソッドですが、これはRigidbodyに対し力を加えるメソッドです。加える力はベクトルで表され、ここではnew Vector3(10, 0, 0)
となっています。
Vector3
はUnityにおける3次元ベクトルを表現する構造体で、new Vector3(x, y, z)
のように定義します。X軸は横軸、Y軸は鉛直軸、Z軸が奥行軸です。ついでにそれぞれの正の方向は、X軸+が右、Y軸+が上、Z軸+が奥となります。これはUnityにおける例ですが、他の3Dソフトウェアでは異なることもあるので注意が必要です。
new Vector3(10, 0, 0)
は右方向への大きさ10のベクトルを示していたわけですね。
さきほどは右方向へ常に一定の大きさの力を加えていました。これをユーザーのキーボード入力に対応させたいところです。
先ほどのFixedUpdate()
を編集します。
void FixedUpdate()
{
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
GetComponent<Rigidbody>().AddForce(new Vector3(horizontal, 0, vertical) * 10);
}
さて、なにやら記述が増えていますね。
float horizontal = Input.GetAxis("Horizontal");
float vertical = Input.GetAxis("Vertical");
Input.GetAxis()
は、キーボードの入力を取得する記述です。引数に"Horizontal"
を指定することで左右入力が、"Vertical"
を指定することで上下入力がそれぞれ取得できます。取得できる値の範囲は-1~1です。
これで入力が取れたので、Rigidbodyに力を加えます。
GetComponent<Rigidbody>().AddForce(new Vector3(horizontal, 0, vertical) * 10);
注目すべきはnew Vector3(horizontal, 0, vertical) * 10
ですね。Xに横入力、Zに縦入力を設定し、ベクトルを10倍しています。
ボールが動くようになりました!