クリアメモリ

プログラミングやモーショングラフィックス、便利なアプリケーションなど雑多に記録するブログ

Unityで銃弾を撃つスクリプト(動画あり) |アクションゲーム

f:id:clrmemory:20170422163212p:plain 

アクションゲームで「銃で敵を倒しながら進む」というようなゲームの場合、銃弾が飛んでいかなければ話になりませんよね。

 

そこで今回は、アクションを起こすと銃弾が飛んでいくようにする方法を紹介します。

今回は試しに作ったので、画像や移動処理などが多少雑になっています。もっと効率の良い処理ができる場合は、書き換えてみてください。

 

 

はじめに

 

今回は以下のような画像を使ってテストしていきます。

 

まず銃を持たせる人の画像です。こちらはかなり適当に作りました…。

 

hito sozai

 

続いてこの人に持たせる銃の画像です。

 

ピストル 素材

銃を描いたのは初めてだったので、細かい部分がよくわかりませんでした。

おかしな部分があったらゴメンなさい。

 

そして、飛んでいく銃弾です。

銃弾 素材

 

今回はかなり雑な画像なので、今回の作業をテストするときは各自画像を揃えてください。

 

移動処理と発射処理

 

ではいよいよコードを書いていきます。

まず「プレイヤーの移動処理」と「銃弾の発射処理」を書きましょう。

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour {
    GameObject Player;
    GameObject Instance;
    public GameObject Bullet;
    public float speed;
    // Use this for initialization
    void Start () {
        Player = GameObject.Find ("Player");
        Instance = GameObject.Find ("Instance");
    }

    // Update is called once per frame
    void Update () {

        //移動処理
        if (Input.GetKey (KeyCode.RightArrow)) {
            speed = 1000;
            Player.GetComponent ().velocity = (Vector2.right * speed * Time.deltaTime);
        } else if (Input.GetKey (KeyCode.LeftArrow)) {
            speed = 1000;
            Player.GetComponent ().velocity = (Vector2.right * -speed * Time.deltaTime);
        }else {
            speed = 0;
            Player.GetComponent ().velocity = (Vector2.right * -speed * Time.deltaTime);
        }

        //弾を撃つ処理
        if (Input.GetKeyDown (KeyCode.S)) {
            Instantiate (Bullet, Instance.transform.position, Quaternion.identity);
        }

        //ジャンプ
        if (Input.GetButtonDown ("Jump")) {
            Player.GetComponent ().velocity = (Vector2.up * 100);
        }

        //振り向き処理
        if (Input.GetKeyDown (KeyCode.RightArrow)) {
            if(Player.transform.rotation.y != 0){
                Player.transform.rotation = new Quaternion (0, 0, 0,0);
            }

        } else if (Input.GetKeyDown (KeyCode.LeftArrow)) {
            if (Player.transform.rotation.y == 0) {
                Player.transform.rotation = new Quaternion (0, 180, 0,0);
            }
        }
    }
}

 

今回はテストコードなので省きましたが、実際にゲームを作るときは「Update( )」と「FixedUpdate( )」を使い分けてください。動作に支障が出る場合があります。

 

https://clrmemory.com/unity/proper-update-fixedupdate/

 

 

 

一から作り始める人はこのコードをそのまま追加すれば良いのですが、すでにオブジェクトを動かす処理を書いている人は「移動処理」や「振り向き処理」などを追加する必要はありません。

 

その場合「弾を撃つ処理」の部分だけを切り取り、今あるコードに追加してください。

 

 

軽くコードの説明をしておきます。

まず移動処理ですが「キーボードの→を押すと右へ進み」「キーボードの←を押すと←へ進む」という処理です。

値はそれぞれ変更してください。

 

 

次にジャンプ処理です。

これはそのままの意味で、「スペースキーを押したら上方向に力をかける」というものになっています。

 

 

続いて振り向き処理です。微妙にわかりづらくなっていますが「右を向いていないときに→を押したらオブジェクトのyを0°にする」「左を向いていないときに←を押したらオブジェクトのyを180°回転させる」というコードになっています。

 

 

最後に弾を撃つ処理です。

ここでは「弾を生成する」処理は書いているのですが、「弾が進む」処理は記述していません。

弾が進む処理は「弾のプレハブ」に追加したほうが都合が良さそうなのでそうしました。

 

 

弾を生成する座標は「instance」というオブジェクトの位値になっています。

「instance」は銃口のあたりに合わせて作成しています。以下の画像を参考にして配置してみましょう。

 

スクリーンショット 2015-12-21 17.11.38

※銃と弾の表示順位を調整してください。銃が上に、弾が下に表示されるようにします。

 

弾の移動処理

 

今回はSキーを押すと弾が生成されるようになっています。

ですが、このままでは弾が進まない状態なので、弾のプレハブに追加するコードを書いていきましょう。

 

using UnityEngine;
using System.Collections;

public class bullet : MonoBehaviour {
    GameObject Player;
    // Use this for initialization
    void Start () {
        Player = GameObject.Find ("Player");
    }

    // Update is called once per frame
    void Update () {
        if (Player.transform.rotation.y != 0) {
            transform.rotation = new Quaternion (0, 180, 0, 0);
            GetComponent ().velocity = (new Vector3 (-50, 0, 0));
        } else if (Player.transform.rotation.y == 0) {
            GetComponent ().velocity = (new Vector3 (50, 0, 0));
        }
    }
    void OnTriggerEnter2D(Collider2D col){
        if(col.gameObject.tag =="DestroyCollider"){
            Destroy(this.gameObject);
        }
    }
}

 

プレイヤーが右を向いていたら弾が右に進み、左を向いていたら弾が左に進むようになっています。

さらに、DestroyColliderにぶつかったら弾のオブジェクトを削除するようにしています。

 

 

ここまできたらコード側の処理は完成です。あとはUnity側でコライダーやRigidbody、タグなどを追加してください。このままではエラーが発生するので、コードを変更するなどしてください。

 

確認

 

全ての工程が完了したら、実際に確認してみてください。

Sキーを押したら弾が飛ぶようになっていたら成功です。

 

また、今回実装した動画を撮影しましたので貼り付けておきます。

 

 

 

まとめ

 

今回の方法を使えば銃を撃つことができるようになるので「敵に当たったらダメージを与える」などしてみてください。

また今回は銃にしましたが、魔法を発動する時などにも応用できそうですね。

「instance」の位置を変更することで、銃弾を生成する位置を変更できるので、応用してみてください。

 

オブジェクトを生成する処理はいろいろな場面で使える処理です。難しいコードではないので、是非覚えておきましょう。

 

ではまた。