はじめに
どうも。最終回です。
今日やること
- ゲームをコントローラーに対応させる
- ゲームのエクスポート
前回のおさらい
前回(https://ch-random.net/post/1945/)は、UIの作成を行いました。
コントローラー対応
Unityでは、コントローラー(ゲームパッド)での操作も簡単に実装することができます。
Playerスクリプトの操作を実装している部分を変更して、ゲームをコントローラーに対応させましょう。
//速度
float speed = 3f;
// 自身のRigidbody2Dを取得してrbに代入
Rigidbody2D rb = GetComponent<Rigidbody2D>();
// 長くなるので水平軸を変数に代入
float axis = Input.GetAxis("Horizontal");
//水平軸*speedを速度のX成分にする
rb.velocity = new Vector2(speed * axis, 0);
Updateメソッドの最初の方で、プレイヤーの移動を実装していた部分をこんな感じに変えます。
↑全体のスクリプトはこんな感じになります。
Input.GetAxisで水平方向の入力を-1~1の範囲の実数で取得し、それにspeed(=3)を掛けて速度のx成分としています。
スティックを右に倒すと水平軸(Input.GetAxis("Horizontal"))は1, 左に倒すと-1となるのでX方向の向きとも合っています。
ちなみに、GetAxisの代わりにGetAxisRawというメソッドを使うと、-1か0か1の値で水平軸を取得できます。今回の場合はどちらを使ってもOKです。
これでテストプレイをすると、今まで通り矢印キーでプレイヤーの操作ができる上に、コントローラーをPCに繋いで操作することもできます。
Input Manager
水平軸を含む色々な入力の設定は、Input Managerと呼ばれるもので行うことができます。
メニューの「編集」→「プロジェクト設定...」をクリックして、
「Input Manager」の項目から設定することができます。
デフォルトでは「Horizontal」という名前の軸に、左右の矢印キーとA, Dキーが割り当てられています。
このようにキーボードからの入力をInput Managerで取得する場合は、「タイプ」を「キーまたはマウスボタン」に設定する必要があります。
一方、ジョイスティックからの入力を得る場合は「タイプ」を「ジョイスティック軸」にします。どのスティックから取得するかは「軸」の欄から設定できます。(左スティックの水平方向は「X軸」で取得)
Input Managerの厄介なところは、使うコントローラーによって取得できる入力が異なるということです。(つまり、何も対策をしないとコントローラーによって対応するボタンが変わる)
エクスポート
次はゲームを出力(エクスポート)していきます。
上部メニューの「ファイル」→「ビルド設定」をクリックします。
ここでビルド(エクスポート)の設定を行うことができます。
今回はシーンが一つなので大丈夫ですが、全てのシーンが「ビルドに含まれるシーン」に入っていることを確認してください。0番目(一番上)のシーンがゲーム開始時に読み込まれます。
プラットフォーム(ゲームをプレイする環境)はWindowsにするのでこのままで構いません。(Macの方はMacに設定しておきましょう)
左下の「プレイヤー設定...」をクリックすると、ゲームの名前やアイコンを設定できます。今回はデフォルトのままにしておきます。
設定を終えたら、右下の「ビルド」をクリックします。
エクスポート先を指定します。今回はC:\work\unity\buildsに本ゲーム用のフォルダ(Breakout)を作って指定しました。
「フォルダーの選択」をクリックするとビルドが始まります。
ビルドが終わると、指定したフォルダに色々生成されます。
赤く囲ってある、プロジェクト名.exeがゲームの本体です。これを実行するとゲームが起動します。
他のファイルはゲームを起動する際に必要になので、間違って削除しないようにしましょう。
C#プログラミング入門5
最後に、Unityでのプログラミングについて少し書いておきます。
ベクトル(Vector2, Vector3)
ベクトルを扱うクラスであるVector2, Vector3についてです。
void Update()
{
// 自身のRigidbody2Dを取得してrbに代入
Rigidbody2D rb = GetComponent<Rigidbody2D>();
// 速度を0にする
rb.velocity = new Vector2(0, 0);
if (Input.GetKey(KeyCode.LeftArrow))
{
// もし左矢印キーが押されたら速度ベクトルを(-3, 0)にする
rb.velocity = new Vector2(-3, 0);
}
else if (Input.GetKey(KeyCode.RightArrow))
{
// もし右矢印キーが押されたら速度ベクトルを(3, 0)にする
rb.velocity = new Vector2(3, 0);
}
}
こちらは第2回で扱ったPlayerスクリプトの一部ですが、ここでVector2を使っています。
今回は2Dゲームなので二次元のベクトルを扱うVector2を使っています。(Vector3は三次元)
Vector2 v1 = new Vector2(3, 0); //(3, 0)のベクトル
Vector2 v2 = Vector2.zero; //(0, 0)のベクトル
Vector2 v3 = v1.normalized; //(1, 0)のベクトル
Vector2 v4 = v1 + v3; //(4, 0)のベクトル
X, Y成分それぞれを指定してベクトルを作る例と、Vector2に用意されている変数(読み取り専用)を使ってベクトルを作る例です。
Vector2.zeroはその名の通り零ベクトルで、Vector2.normalizedは向きはそのままで絶対値(長さ)が1になるようなベクトルです。
また、+や-などの演算子も使うことができます。通常のクラスではインスタンス同士の足し算などはできませんが、Vectorなどの一部のクラスに関しては使うことができます。
ちなみに、ベクトルのX成分やY成分はVector2.xやVector2.yで取得できますが、この変数は読み取り専用なので以下のような書き方はできません。
Vector2 v = new Vector2(1, 2);
v.x = 2; //これだとエラーになる
片方の成分だけ変えたい場合は以下のように書きましょう。
Vector2 v = new Vector2(1, 2);
v = new Vector2(2, v.y);
上記のことはVector3にも当てはまります。
コンポーネントをスクリプトで扱う
コンポーネントに関する処理をスクリプトでしたい場合についてです。
// 自身のRigidbody2Dを取得してrbに代入
Rigidbody2D rb = GetComponent<Rigidbody2D>();
第2回のPlayerスクリプトのこちらの部分を例にして説明します。
このように、MonoBehaviourクラス(第4回参照)のGetComponentメソッドでコンポーネントのインスタンスを取得できます。
ただしTransformについては例外で、こちらはMonoBehaviour.transformという変数からアクセスできます。
Transformは位置や回転、スケールを扱うコンポーネントですので使う頻度は多いです。
public class Player : MonoBehaviour
{
void Start()
{
//スタート時にオブジェクトを原点に移動
transform.position = new Vector3(0, 0, 0);
}
}
↑使う際はこんな感じです。
Unityスクリプトリファレンス
Unity側で用意されているクラスのメンバ変数やメソッドについて知りたいなら、Unity公式のリファレンスを使うのがおすすめです。
↓こちらはGameObjectクラスのページです。
https://docs.unity3d.com/ja/2020.3/ScriptReference/GameObject.html
変数やメソッドについての簡易的な説明文も載っています。
さいごに
これでUnity勉強会は終了となります。お疲れ様でした。