アクションゲームで「銃で敵を倒しながら進む」というようなゲームの場合、銃弾が飛んでいかなければ話になりませんよね。
そこで今回は、Unityで作成したゲームで、アクションを起こすと銃弾が飛んでいくようにする方法を紹介します。
今回は試しに作ったので、画像や移動処理などが多少雑になっています。
もっと効率の良い処理ができる場合は、書き換えてみてください。
はじめに
今回は以下のような画像を使ってテストしていきます。
まず銃を持たせる人の画像です。
こちらはかなり適当に作りました…。
続いてこの人に持たせる銃の画像です。
銃を描いたのは初めてだったので、細かい部分がよくわかりませんでした。
おかしな部分があったらゴメンなさい。
そして、飛んでいく銃弾です。
今回はかなり雑な画像なので、今回の作業をテストするときは各自画像を揃えてください。
移動処理と発射処理
ではいよいよコードを書いていきます。
まず「プレイヤーの移動処理」と「銃弾の発射処理」を書きましょう。
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( )」を使い分けてください。動作に支障が出る場合があります。
【Unity】Update()とFixedUpdate()には使い分けがあった!? - クリアメモリ
一から作り始める人はこのコードをそのまま追加すれば良いのですが、すでにオブジェクトを動かす処理を書いている人は「移動処理」や「振り向き処理」などを追加する必要はありません。
その場合「弾を撃つ処理」の部分だけを切り取り、今あるコードに追加してください。
軽くコードの説明をしておきます。
移動処理
まず移動処理ですが「キーボードの→を押すと右へ進み」
「キーボードの←を押すと←へ進む」という処理です。
値はそれぞれ変更してください。
ジャンプ処理
次にジャンプ処理です。
これはそのままの意味で、「スペースキーを押したら上方向に力をかける」というものになっています。
振り向き処理
続いて振り向き処理です。微妙にわかりづらくなっていますが
「右を向いていないときに→を押したらオブジェクトのyを0°にする」
「左を向いていないときに←を押したらオブジェクトのyを180°回転させる」
というコードになっています。
弾を撃つ処理
最後に弾を撃つ処理です。
ここでは「弾を生成する」処理は書いているのですが、「弾が進む」処理は記述していません。
弾が進む処理は「弾のプレハブ」に追加したほうが都合が良さそうなのでそうしました。
弾を生成する座標は「instance」というオブジェクトの位値になっています。
「instance」は銃口のあたりに合わせて作成しています。以下の画像を参考にして配置してみましょう。
※銃と弾の表示順位を調整してください。銃が上に、弾が下に表示されるようにします。
弾の移動処理
今回は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」の位置を変更することで、銃弾を生成する位置を変更できるので応用してみてください。
オブジェクトを生成する処理はいろいろな場面で使える処理です。難しいコードではないので是非覚えておきましょう。
【Unity】AutoSaveを使えば自動で保存できる!Unityが落ちても安心だった! - クリアメモリ
ではまた。