前回の記事では、宇宙戦闘機を動かすところまでやったと思います。
今回は、その宇宙戦闘機から弾が発射出来るようにしたいと思います。
目次
準備
まずは、2つ準備をしてもらいます。
[Prefab]フォルダの作成
MyFolderの中に[Prefab]というフォルダを作成してください。
AssetStoreから素材の追加
AssetStoreから[Simple Particle Pack]というのをインポートしてください。
2つともやり方は、以前の記事で書いているのでもしわからない場合はもう一度見てみてください。
弾の作成
宇宙戦闘機から発射される、弾の作成をします。
[SimpleParticlePack]→[Resources]→[Directional]にある[Torch]を[Hierarchy]に追加します。そして、[MyFolder]の[Script]の中に[Bullet]というソースファイルを作成してください。
そして、先ほど[Hierarchy]に追加した[Torch]にドラッグ・アンド・ドロップしてください。
Bullet.csの作成
先ほど作成した[Bullet]のソースファイルの中を書いていきます。
using UnityEngine; using System.Collections; public class Bullet : MonoBehaviour { float bulletSpeed = 2; // Use this for initialization void Start () { Destroy(this.gameObject, 5); } // Update is called once per frame void Update () { transform.Translate(0, 0, bulletSpeed); } }
<code class="csharp keyword">float</code> <code class="csharp plain">bulletSpeed = 2;</code>
7行目は、弾が飛ぶSpeedの設定です。
2が今の設定しているSpeedで、これを大きくすればするほど早くなります。
transform.Translate(0, 0, bulletSpeed);
15行目も、宇宙戦闘機の時に見たものと同じですね。
今回は、キー入力関係なくつねに前方に進んでいくようにif文等は必要がありません。
<code class="csharp plain">Destroy(</code><code class="csharp keyword">this</code><code class="csharp plain">.gameObject, 5);</code>
11行目は、始めてるものです。
Destroy()は、ゲームオブジェクトを削除する時に使用するものです。
今回は、Destroy(this.gameObject, 5);と引数が2つ使ったものを使用しています。
1つ目の引数に、削除するゲームオブジェクトを入れます。
今回の場合は、弾を削除するので[this.gameObject]です。
thisは、自分自身の事です。
そして、2つ目の引数が何秒後に削除するかの設定です。
今ですと、[5]と設定しているので5秒後に削除がされます。
また、書かれている場所がStart()関数なのでゲームが開始されて五秒後にという意味になります。
Prefabの作成
Prefabとは、加工したゲームオブジョクトの事です。
加工したゲームオブジョクトは、Prefab化する事で保存する事が出来、簡単に何度も利用する事が出来ます。
弾として作成した[Torch]をPrefab化します。
方法は、準備で作成してもらった[Prefab]フォルダにドラッグ・アンド・ドロップしてもらうだけです。
[Prefab]フォルダに入れた事を確認して、[Hierarchy]タブから[Torch]を削除してください。
Prefabをセットする
先ほど作ったPrefabを宇宙戦闘機にセットして、スペースを押すたびに弾が発射されるようにしていきます。
StarfighterControl.csの更新
[StarfighterControl.cs]コードに追加で書いていきます。
using UnityEngine; using System.Collections; public class StarfighterControl : MonoBehaviour { float X_Speed = 1; float Z_Speed = 1; public GameObject Prefab; float intervalTime; // Use this for initialization void Start() { intervalTime = 0; } // Update is called once per frame void Update() { float vertical = Input.GetAxis("Vertical"); float horizontal = Input.GetAxis("Horizontal"); if (Input.GetKey("up")) { transform.Translate(0, 0, vertical * Z_Speed); } if (Input.GetKey("down")) { transform.Translate(0, 0, vertical * Z_Speed); } if (Input.GetKey("left")) { transform.Translate(horizontal * X_Speed, 0, 0); } if (Input.GetKey("right")) { transform.Translate(horizontal * X_Speed, 0, 0); } intervalTime += Time.deltaTime; if (Input.GetKey("space")) { if (intervalTime >= 0.1f) { intervalTime = 0.0f; Instantiate(Prefab, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity); } } } }
これが追加された[StarfighterControl.cs]です。
public GameObject Prefab; float intervalTime;
追加された9行・10行目は今回使う変数の定義です。
9行目が、作ったPrefabを入れるモノ
10行目が、連続で弾が出ないように、インターバル時間を入力する変数です。
intervalTime += Time.deltaTime;
if (Input.GetKey(“space”)) {
if (intervalTime >= 0.1f) {
intervalTime = 0.0f;
Instantiate(Prefab, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);
}
}
38行目から44行目が今回のメインのコードです。
[intervalTime += Time.deltaTime;]では、前のフレームと今のフレームの時間的な差分が格納されています。
なので、これで毎フレームと何秒空いているのかがわかります。
そして、[ if (Input.GetKey(“space”))]でスペースが押された場合の条件を追加し、[ if (intervalTime >= 0.1f) ]で、前に押された時よりも0.1秒空いていればという条件を追加しています。
また、その条件に入った場合に[intervalTime = 0.0f;]で intervalTimeの時間を0に戻しています。
[Instantiate(Prefab, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);]が一番メインの文です。
[Prefab]が作成した弾のPrefabを入れる予定の変数です。 そして、[new Vector3(transform.position.x, transform.position.y, transform.position.z)]がその弾をどこに出すかの設定です。
今回は、宇宙戦闘機も動くので、弾を出す時に宇宙戦闘機の位置を取得して、それと同じ位置に出現するように設定しています。
最後の[Quaternion.identity]は回転ですが、今回は回転させないのでこのままで大丈夫です
Unity上でPrefabをセットする
では、変数Prefabに先ほど作成したPrefab[Torch]を追加します。
いま、[StarFighter]に追加した[StarFighterControl]のところが少し変わって、Prefabの横が青線のようになっていると思います。
ここに、弾のPrefabをセットします。
いつものように。ドラッグ・アンド・ドロップで、設定します。
実行をして確認
今回した処理が動くのか実行をして確認しましょう。
こんな感じでしたら大丈夫です。
まとめ
今回は、弾を発射出来るようにしました。
まずは、弾を作りそれの動きをプログラミングで制御をして、Prefabをする。
そして、そのPrefabをたくさん作成して弾として使う。
流れ的には、こういう感じです。
Unityでのゲーム制作では、Prefabはよく使うので覚えておいてください。
次回は、カメラ周りの事をやろうと思います。
では。
コメント
ものすごく、為になり、初めてのunityでもゲーム作成が出来ました。
しかし問題が起こっていて、スペースキーを押さなくても、常に弾が発射されている状態です。
変更したのは、弾のサイズなどです。
C#のソースコードはコピペなので間違ってはいないと思いますが、何が原因でしょうか?
先ほどそのコードをそのまま書いたんですがスペースキーで引っかかってるみたいでほかのキーに設定しても同じことが起こるのですが何故でしょうか?
質問です。弾を発射してしばらくすると、かってにHierarchyからtorchが消えます。
なぜでしょうか?