次に、スクリプトを作成します。
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」で「空のオブジェクト」を作成
・名前を「ShotShell」に変更
・「Position」と「Rotation」は全て「0」にしておきます。
・この「ShotShell」オブジェクトに「ShotShell」スクリプトをドラッグ&ドロップ
・「Shell Prefab」の空欄には「Shell」プレファブをドラッグ&ドロップ
・「Shot Speed」は「1500」に設定(*好きな数字で構いません。)
・「cannon1」という音源データを「Shot Sound」にドラッグ&ドロップ
*事前に「Import New Assets」を使って「音源データ」をUnityの中に入れておきましょう。
・これで設定完了です。
・ここまでできたら「再生ボタン」を押してみましょう。
・「control」ボタンを押すと砲弾が発射されて、発射音も出たら成功です。
次は、この「ShotShell」をボールに設置します。
3)BallにShotShellを設置する。
まず、「Ball」と「ShotShell」の「位置関係」を決めましょう。
・「Ball」を選択して、Positionを「0,1,0」に設定します。
・次に、「ShotShell」を選択して、Positionを「o,1,1」に設定します。
*ポイントはBallよりも少し前になるようにすることです。
ここまでできたら「再生ボタン」を押して砲弾を発射してみましょう。
「Ball」を動かすとどうでしょうか?
Ballと全然「違う場所」で砲弾が発射されると思います。
これを常に「同じ場所」で発射されるように変更します。
その原理(考え方)は、以前学んだ「追っかけカメラ」と同じです。
Ballが動いても、BallとShotShellの位置関係が常に同じになるようにスクリプトで調整します。
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」オブジェクトにドラッグ&ドロップしましょう。
・「Target」には「Ball」を設定します。
・ここまでできたら「再生ボタン」を押してみましょう。
Ballが動いても同じ場所から砲弾が発射されると成功です。
なお、「ShotShell」の「Rotation」を変更することによって、「砲弾の飛び出す角度」を調整することができます。
*少し上向きに砲弾が発射されるようにしましょう。