Unityで作る「シューティングゲーム」マイペースで進んでいますが、ちょっと遅いですか?
教室に遊びに来ていただければ、もしくはオンラインで体験授業を受けいて頂ければ、ご自身のペースで進めることができます。
さて前回まででプレイヤーの左右の動きが出来上がりましたね?
今回はミサイルを撃つことができるように改造していきます。では早速作っていきます。
Step:1 マシン先端からミサイルを出す
①今回はいきなりスクリプトファイルを書いていきますよ。
作成済みの「PlayerController.cs」を開いて、以下のコードを追記してみましょう。
[SerializeField] GameObject weapon_prefab; //❶ミサイル
float shot_speed; //❷ミサイル速度
void Start()
{
shot_speed = 800; //❸ミサイルの速度に800を代入
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space)) //❹スペースキーが押されたら
{
//❺ミサイルを生成し、変数bullet に代入
GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation);
//❻変数bullet に上向きの速度を代入
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed);
}
}
では順に解説していきましょう。
❶ [SerializeField] を宣言することでUnity の inspector から値を代入したり、オブジェクトをセットしたりすることができます。
Public と同じような扱いですが、プログラミング的には共有できる範囲は必要最低限にする方がいいですよね?
ublic よりも限定的な共有となります。
GameObject weapon_prefab; ゲームオブジェクト型の weapon_prefab という名前の変数を宣言しました。後でつかいますよ。
❷ float shot_speed; 小数点型の shot_speed という変数を宣言しました。ミサイルの速さになります。
❸ shot_speed = 800; void start で❷で宣言した変数に800という値を代入しています。
ここから void Update 関数に入ります。
❹if (Input.GetKeyDown(KeyCode.Space)) もしスペースキーが押されたら、そのままですね?
❺ GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation);
Instantiate()関数 は何かを生成するというものですよね?
通常引数には1つ、または3つ指定することができます。
どちらも1つ目の引数は「なにを」つまり生成するオブジェクト。今回は❶で宣言した weapon_prefab、つまりミサイルを生成します。
2つ目の引数は、「どこに」ですね?今回はプレイヤーの場所を指定しています。
3つ目の引数は、「向き」です。プレイヤーの向きを指定しました。
そしてこの生成され当たオブジェクトを、あらたに「bullet」という変数に代入しています。
これはこの直後、このオブジェクトに速度を与えるからですよ。
❻bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed);
前回、ミサイルのプレハブに「Rigidbody2D」コンポーネントが追加されていました。
GetComponent()関数 でこのコンポーネントを呼び出して、そこに AddForce()関数 で変数を宣言し初期値800を代入したshot_speed に上向きの力をかけた値を代入して言います。
Unity に戻ってPlayer の inspectorを確認しましょう。
「PlayerContoroller」スクリプトに「Weapon_prefab」という項目が出現していますね?
そこに下の図のようにドラッグ&ドロップ、または右側のボタンを押して「PlayerBulletPrefab」をセットしてください。
この状態で動かしてみましょう。
スペースキーを押すと、マシンの中央からミサイルが発射されますよね?
さて、これだけではつまらないので、強化版も作ってみましょう。アイテムを取得したときにミサイルが強化される、なんて動き、よく見かけます。この準備をしておきたいと思います。
前回作成した「TurretLeft」および「TurretRight」からもミサイルが発射される動きを作ります。
まずは「PlayerTurret.cs」というスクリプトファイルを作成しましょう。
作成したファイルに以下のコードを入力してください。
PlayerController playercontroller; //❼PlayerCOntroller を格納する変数
[SerializeField] GameObject weapon_prefab; //ミサイル
float shot_speed; //ミサイル速度
void Start()
{
shot_speed = 800; //ミサイルの速度
playercontroller = GameObject.Find("Player").GetComponent<PlayerController>(); //❽PlayerControllerの取得
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Z)) //❾Zキーを押したら
{
GameObject bullet = Instantiate(weapon_prefab, transform.position, transform.rotation);
bullet.GetComponent<Rigidbody2D>().AddForce(bullet.transform.up * shot_speed);
}
if (Input.GetKey(KeyCode.D))
{
transform.Rotate(new Vector3(0, 0, -playercontroller.turret_rotation_speed)); //➓右回転
}
if (Input.GetKey(KeyCode.A))
{
transform.Rotate(new Vector3(0, 0, playercontroller.turret_rotation_speed)); //⓫左回転
}
}
では解説していきます。
❼PlayerController playercontroller;
前回、PlayerController に turret_rotation_speed という変数を宣言、初期値を3fにしましたね。
これは今回使用する変数で、Turretを回転する速度になります。Turretに直接入れてもいいのですが、Turretが今後も増えるかも、ということでPlayerで管理しています。
❽playercontroller = GameObject.Find(“Player”).GetComponent<PlayerController>();
上の❼で宣言した変数に、PlayerControllerのデータを代入しています。
まず、Find()関数 で”Player”を探してきます。
探せる範囲は Hierarchy にいるオブジェクトだけですよ。
さらに上で説明した GetComponent()関数 にPlayerController を指定して取得したわけです。
このやり方、今後も何度も使っていくと思いますので、しっかり理解しておきましょう。
❾ここは先ほどのプログラムと同じですね?先ほどはスペースキーを押してミサイルを出しましたが、いったん区別するためにZキーを押してミサイルを生成しています。
➓transform.Rotate(new Vector3(0, 0, -playercontroller.turret_rotation_speed));
Rotate()関数は回転を与える関数です。
Unityではオブジェクトを回転させる方法がいくつかあります。
またどこかのタイミングでまとめて紹介したいと思います。
今回はZ軸を中心に、PlayerControllerから取得した turret_rotation_speed の速度でマイナス方向、つまり逆時計回りに回転させています。
Z軸を中心にってどういうこと?画面手前から画面に向かってペンを立てたとします。そのペンがZ軸になります。
例えばペンにキャラクターを貼り付けていたら、キャラクターが回りますよね?そんなイメージです。
⓫これは➓の逆ですね?時計回りに回転させます。
これでスクリプトファイルは完成したので、「PlaeyerTurret.cs」を「TurretLeft」および「TurretRight」にアタッチします。
続いて、「TurretLeft」および「TurretRight」の inspector から「Weapon_prefab」にドラッグ&ドロップ、または右側のボタンを押して「PlayerBulletPrefab」をセットしてください。
これでZボタンを押すと、ミサイルが左右から1発ずつ、合計2発発射されるはずです。
さらにAボタン、またはDボタンを押したときに、Turretが回転してミサイルが発射される角度も変わるのを確認してみましょう。
※PlayerBulletPrefab はエラーが出るようです。これは次回修正しますので、そちらでご確認ください。
今回はここまで。ちょっと難しかったかな?次回は隕石や宇宙デブリを出現させてみましょう。
ファイブボックスでは教室での授業の他、全国どこからでもご参加できるオンライン授業も行っています。いずれも体験授業を行っているので、今回の授業にご興味がありましたら、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。