【2Dシューティング】Unity公式チュートリアルをやってみる2回目。自機の移動と弾

2Dシューティング】Unity公式チュートリアルをやってみるシリーズの2回目です。前回は準備と部品の作成がメインで地味な作業が続きました。というか基本的にすべて地味な作業ではあります。
【2Dシューティング】Unity公式チュートリアルをやってみる1回目

今回からやっとスクリプトが書けます。

自機を移動させよう

ここでやること

おおまかに言えば以下の2つ、慣れてしまえば簡単だ。

  • 自機スクリプトの作成(PlayerScript)
  • 自機オブジェクトにRigidbody2Dコンポーネントを追加
  • 自機オブジェクトにPlayerScriptをアタッチ

自機スクリプトを作成しよう。

まずはScriptを管理するScriptsフォルダを作成して、そこにScriptwを作成していこう。公式とは手順は違いますけどやってることは同じです。自機が移動できるようコードを実装していきますが、もはや決まり文句みたいなものなのでコピペでいいと個人的には思っております・・・・。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour {
	public float speed = 5;

	//毎フレーム呼ばれる関数
	void Update () {
		float x = Input.GetAxisRaw("Horizontal");//右・左
		float y = Input.GetAxisRaw("Vertical");//上・下
		//移動する向きを決める
		Vector2 direction = new Vector2(x, y).normalized;
		//移動する向きとスピードを代入する
		GetComponent<Rigidbody2D>().velocity = direction * speed;
	}
}

コードはC#で書きます。エディターはWindowsだとデフォルトではVisualStudioとかになっているはずですが、エディターを変えることもできます。使い慣れたエディターでもよいですがVisualStudio以外だと補完が弱くなる可能性はあります。

RigidBody2Dコンポーネントを追加しよう

RigidBody2Dを追加するにはInspector下部のadd componentから行う。RigidBody2Dを追加する理由は「2Dのための物理挙動を行うのに必要なクラスで、重力の影響や、物体の移動はこのクラスを介して行われるから。」

作ったスクリプトを自機オブジェクトにアタッチしよう

Unityではオブジェクトになにかをドラッグ&ドロップすることがよくあります。このような作業をアタッチといいます。公式チュートリアルどおりすすめていれば現時点でオブジェクトはなにもない状態です。PrefabからPlayerをhierarkhyに移します。これでPlayerオブジェクトができたので作ったScriptをアタッチします。
screenshot 20181212 0153

ここまでの状態

矢印キーで上下左右移動が可能になりました。一応同時押しで斜め移動もできる格好です。
screenshot-20181212-0158

自機から弾を発射させよう

ここでやること

  • 空のゲームオブジェクトを作成
  • 弾を空のゲームオブジェクトにアタッチ
  • 弾をPrefab化しておく
  • 弾のスクリプトを作成
  • PlayerScriptに弾を発射するコードを追加

まあめんどくさい作業ばかりです。

空のゲームオブジェクトを作って、弾をアタッチしよう

空のゲームオブジェクトを作るにはhierarkhyのcreate→Create Emptyを選択します。名前は「PlayerBullet」としました。→加えてRigidbody2Dを追加しGravityScale0に。次に弾をアタッチします。発射口が2個あるので弾オブジェクトを複製します。複製するには右クリック→Duplicateでできますが、Ctrl-dで複製するテクニックを使ったほうが楽でしょう。

2つの弾オブジェクトをPlayerBulletにアタッチします。わかりにくすぎると思うので画像みたほうがいいです。アタッチしたらPrefab化しておきますscreenshot 20181212 1730

弾の位置調整は適当にちまちまとした作業なのでさっさとやります。

オブジェクトの位置調整
Bullet1Bullet2Player
X-0.10.10
Y0.20.20

弾のスクリプトを作ろう

コピペでもよいかと思います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BulletScript : MonoBehaviour {
	public int speed = 10; //弾の速さ

	void Start () {
		GetCompnent<Rigidbody2D>().velocity = transform.up.normalized * speed;
	}

}

このスクリプトをPlayerBulletにアタッチ。この時点で再生すると弾が上にとんでいく。

Playerから弾を発射できるようPlayerScriptを編集しよう

PlayerScriptを編集します。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerScript : MonoBehaviour {
	public float speed = 5;
	public GameObject bullet;

	//Startメソッドをコルーチンとして呼び出す
	IEnumerator Start(){
		while(true){
			//弾をプレイヤーと同じ位置/角度で作成
			Instantiate(bullet, transform.position, transform.rotation);
			//0.05秒まつ
			yield return new WaitForSeconds(0.05f);
		}
	}

	//毎フレーム呼ばれる関数
	void Update () {
		float x = Input.GetAxisRaw("Horizontal");//右・左
		float y = Input.GetAxisRaw("Vertical");//上・下
		//移動する向きを決める
		Vector2 direction = new Vector2(x, y).normalized;
		//移動する向きとスピードを代入する
		GetComponent<Rigidbody2D>().velocity = direction * speed;
	}
}

ここでコルーチンという概念がでてくるのですが、どういうときに利用するかというと「時間のかかる処理や、何かを待機するような処理をUpdateメソッド内で行うと、その処理が終わるまでゲームの進行がストップしてしまいます。 このような処理は数秒待機したり、特定の処理が終わるまで待機することが可能なコルーチンを利用します。」

これをみても意味不明なのでとりあえずIEnumeratorがついてたらコルーチンなんだなと思っておけばいいかと思います。上の例はStartメソッドをコルーチンとして呼び出しています。コードを書き終わったら保存します。今回新たに変数を定義したので弾のPrefabがアタッチ可能になります。Playerオブジェクトに弾Prefabをアタッチしておきましょう。

ここまでの状態

まあいろいろめんどくさいけど、とりあえず自動弾が出るようになる。(なんで自動発射なのかはさておき)
screenshot-20181212-1758

次の記事

次の記事は敵の作成です。
【2Dシューティング】Unity公式チュートリアルをやってみる3回目。敵の作成