[22]ボールから砲弾を発射しよう②(砲弾スクリプト)

次に、スクリプトを作成します。

1)砲弾(Shell)を発射するスクリプトを作成する。

「C# Script」を1つ作成し、名前を「ShotShell」に変更します。

・作成した「ShotShell」スクリプトをダブルクリックしてください。

・下記のコードを記載しましょう。

*横スクロールするとコードの全体を見ることができます。

using UnityEngine;
using System.Collections;

public class ShotShell : MonoBehaviour {

	// ここにデータを入れる箱(=変数)を書こう!
	public GameObject shellPrefab;
	public float shotSpeed;
	public AudioClip shotSound;


	// 命令ブロック(1)
	void Update () {

		// もしも「Fire1」というボタンが押されたら(条件)
		if(Input.GetButtonDown("Fire1")){

			// ①Shotという名前の命令ブロック(関数)を実行する。
			Shot();

			// ②効果音を再生する。
			AudioSource.PlayClipAtPoint(shotSound, transform.position);
		}
	}

	// 命令ブロック(2)
	public void Shot(){

		// プレファブから砲弾(Shell)オブジェクトを作成し、それをshellという名前の箱に入れる。
		GameObject shell =  (GameObject)Instantiate(shellPrefab, transform.position, Quaternion.identity);

		// Rigidbodyの情報を取得し、それをshellRigidbodyという名前の箱に入れる。
		Rigidbody shellRigidbody = shell.GetComponent<Rigidbody>();

		// shellRigidbodyに青軸(=z軸)方向の力を加える。
		shellRigidbody.AddForce(transform.forward * shotSpeed);

		// 砲弾(Shell)を2秒後に削除する。
		Destroy(shell, 2.0f);
	}
}

これでコードが完成しました。

次は、コードを付けるオブジェクトを作成します。

2)空のオブジェクトにコードを付ける!

・「Hierarchy」→「Create」→「 Create Empty」「空のオブジェクト」を作成

スクリーンショット 2016-01-22 14.30.46

・名前を「ShotShell」に変更

・「Position」と「Rotation」は全て「0」にしておきます。

スクリーンショット 2016-01-22 14.31.27

・この「ShotShell」オブジェクトに「ShotShell」スクリプトをドラッグ&ドロップ

スクリーンショット 2016-01-22 14.31.40

・「Shell Prefab」の空欄には「Shell」プレファブをドラッグ&ドロップ

スクリーンショット 2016-01-22 14.31.57

・「Shot Speed」は「1500」に設定(*好きな数字で構いません。)

スクリーンショット 2016-01-22 14.32.07

・「cannon1」という音源データを「Shot Sound」にドラッグ&ドロップ

*事前に「Import New Assets」を使って「音源データ」をUnityの中に入れておきましょう。

スクリーンショット 2016-01-22 14.32.27

・これで設定完了です。

スクリーンショット 2016-01-22 14.32.40

・ここまでできたら「再生ボタン」を押してみましょう。

「control」ボタンを押すと砲弾が発射されて、発射音も出たら成功です。

次は、この「ShotShell」をボールに設置します。

3)BallにShotShellを設置する。

まず、「Ball」と「ShotShell」の「位置関係」を決めましょう。

・「Ball」を選択して、Position「0,1,0」に設定します。

スクリーンショット 2016-02-05 11.25.52

・次に、「ShotShell」を選択して、Positionを「o,1,1」に設定します。

*ポイントはBallよりも少し前になるようにすることです。

スクリーンショット 2016-02-05 11.28.12

ここまでできたら「再生ボタン」を押して砲弾を発射してみましょう。

「Ball」を動かすとどうでしょうか?

Ballと全然「違う場所」で砲弾が発射されると思います。

これを常に「同じ場所」で発射されるように変更します。

その原理(考え方)は、以前学んだ「追っかけカメラ」と同じです。

Ballが動いても、BallとShotShellの位置関係が常に同じになるようにスクリプトで調整します。

スクリーンショット 2016-02-05 11.44.25

3)位置関係を維持するスクリプトを作成

「C# Script」を1つ作成し、名前を「ShotShellPosition」に変更します。

・作成した「ShotShellPosition」スクリプトをダブルクリックしてください。

・下記のコードを記載しましょう。

*横スクロールするとコードの全体を見ることができます。

using UnityEngine;
using System.Collections;

public class ShotShellPosition : MonoBehaviour {

	// ここにデータを入れる箱(=変数)を書きます。
	public GameObject target;
	private Vector3 offset;

	// Use this for initialization
	void Start () {

		// ShotShellの位置と、Ballの位置の差の情報を「offset」という変数に入れる。
		offset = transform.position - target.transform.position;
	
	}
	
	// Update is called once per frame
	void Update () {

		transform.position = target.transform.position + offset;
	
	}
}

・スクリプトが完成したら、「Shotshell」オブジェクトにドラッグ&ドロップしましょう。

スクリーンショット 2016-02-05 11.55.04

・「Target」には「Ball」を設定します。

スクリーンショット 2016-02-05 11.55.12

・ここまでできたら「再生ボタン」を押してみましょう。

Ballが動いても同じ場所から砲弾が発射されると成功です。

なお、「ShotShell」の「Rotation」を変更することによって、「砲弾の飛び出す角度」を調整することができます。

*少し上向きに砲弾が発射されるようにしましょう。