HIROMARTBLOG

Unity、Cocos2d-xのこととか書けたらいいですね。

プログラミング初心者でも簡単!Unity5で3Dシューティングゲーム開発!!~弾の作成とそれのPrefab化~

      2015/03/25

前回の記事では、宇宙戦闘機を動かすところまでやったと思います。

今回は、その宇宙戦闘機から弾が発射出来るようにしたいと思います。

準備

まずは、2つ準備をしてもらいます。

[Prefab]フォルダの作成

MyFolderの中に[Prefab]というフォルダを作成してください。

3dShooting42

AssetStoreから素材の追加

AssetStoreから[Simple Particle Pack]というのをインポートしてください。

3dShooting43

2つともやり方は、以前の記事で書いているのでもしわからない場合はもう一度見てみてください。

弾の作成

宇宙戦闘機から発射される、弾の作成をします。

3dShooting44

[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化する事で保存する事が出来、簡単に何度も利用する事が出来ます。

3dShooting45

弾として作成した[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]を追加します。

3dShooting46

いま、[StarFighter]に追加した[StarFighterControl]のところが少し変わって、Prefabの横が青線のようになっていると思います。

ここに、弾のPrefabをセットします。

3dShooting46

いつものように。ドラッグ・アンド・ドロップで、設定します。

実行をして確認

今回した処理が動くのか実行をして確認しましょう。

3dShooting47

こんな感じでしたら大丈夫です。

まとめ

今回は、弾を発射出来るようにしました。

まずは、弾を作りそれの動きをプログラミングで制御をして、Prefabをする。

そして、そのPrefabをたくさん作成して弾として使う。

流れ的には、こういう感じです。

Unityでのゲーム制作では、Prefabはよく使うので覚えておいてください。

次回は、カメラ周りの事をやろうと思います。

では。

 - IT, Unity , , ,

広告

広告

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

  関連記事

簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~オブジョクトの同期~

前回の記事では、同期するオブジョクトの生成を行ってもらいました。 今回は、オブジ …

簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~同期されるオブジョクトの生成~

前回の記事でサーバーへの接続を行いました。 今回は、オンラインで同期されるゲーム …

簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~アニメーションの同期~

目次1 前回の記事の変更2 Photon Animator Viewの追加3 o …

簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~サーバーへの接続~

前回の記事でPhotonCloudに繋がっている事が確実にわかったと思います。 …

簡単オンラインゲーム開発!!UnityとPhotonCloudで簡単実装~カメラを追随させる~

前回の記事でアニメーションの同期を行いました。 今回の記事では、カメラをそれぞれ …

プログラミング初心者でも簡単!Unity5で3Dシューティングゲーム開発!!~細かな設定~

前回までで、だいたいのゲームシステムは出来たいと思います。 今回は、細かな設定を …

Windows環境でBitbucketとSourceTreeの導入(Bitbucketの設定とSourceTreeのインストール)

BitbucketとSourceTree使い方を数回の記事に分けて、投稿していこ …

3Dシューティングゲームを公開

前回までで紹介してきた「プログラミング初心者でも簡単!Unity5で3Dシューテ …

プログラミング初心者でも簡単!Unity5で3Dシューティングゲーム開発!!~AssetStoreの使い方とシーンへの追加~

前回の記事 でプロジェクトの作成とUnityの設定をしたと思います。 今回は、A …

Windows環境でBitbucketとSourceTreeの導入(リポジトリの作成とSourceTreeへのクローンの方法)

前回の記事の続きです。 SSHキー作成をしたと思います。 もし、作成出来てない場 …