質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4751閲覧

撃つ弾の切り替えを行いたい

Kamizaki_H_ARIA

総合スコア13

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2018/11/26 11:10

前提・実現したいこと

今、unityで横スクロールシューティングゲームを作っています。敵の攻撃手段として、ミサイルと通常弾を発射して攻撃するのですが、振り分けているキーを押すと弾が出るようにしているため、この二つの弾が同時に出てしまいます。通常弾をセットしているときはミサイルが撃てない、といった事をする方法が調べてもよくわかりませんでした。この方法を教えていただきたいです。

発生している問題・エラーメッセージ

攻撃手段であるミサイルと通常弾が同時に発射される

該当のソースコード

ソースコード

Playerにアタッチしているscript
using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour
{

public float speed = 4f; public float jumpPower = 700; public LayerMask groundLayer; public GameObject mainCamera; public GameObject bullet; private Rigidbody2D rigidbody2D; private Animator anim; private bool isGrounded; private Renderer renderer; void Start() { anim = GetComponent<Animator>(); rigidbody2D = GetComponent<Rigidbody2D>(); renderer = GetComponent<Renderer>(); } void Update() { isGrounded = Physics2D.Linecast( transform.position + transform.up * 1, transform.position - transform.up * 0.05f, groundLayer); if (Input.GetKeyDown("left shift")) { if (isGrounded) { anim.SetBool("Dash", false); anim.SetTrigger("Jump"); isGrounded = false; rigidbody2D.AddForce(Vector2.up * jumpPower); } } float velY = rigidbody2D.velocity.y; bool isJumping = velY > 0.1f ? true : false; bool isFalling = velY < -0.1f ? true : false; anim.SetBool("isJumping", isJumping); anim.SetBool("isFalling", isFalling); if (Input.GetKeyDown("space")) { anim.SetTrigger("Shot"); Instantiate(bullet, transform.position + new Vector3(0.4f, 1.2f, 0f), transform.rotation); // ショット音を鳴らす GetComponent<AudioSource>().Play(); } } void FixedUpdate() { float x = Input.GetAxisRaw("Horizontal"); if (x != 0) { rigidbody2D.velocity = new Vector2(x * speed, rigidbody2D.velocity.y); Vector2 temp = transform.localScale; temp.x = x; transform.localScale = temp; anim.SetBool("Dash", true); if (transform.position.x > mainCamera.transform.position.x - 4) { Vector3 cameraPos = mainCamera.transform.position; cameraPos.x = transform.position.x + 4; mainCamera.transform.position = cameraPos; } Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0)); Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1)); Vector2 pos = transform.position; pos.x = Mathf.Clamp(pos.x, min.x + 0.5f, max.x); transform.position = pos; } else { rigidbody2D.velocity = new Vector2(0, rigidbody2D.velocity.y); anim.SetBool("Dash", false); } } void OnCollisionEnter2D(Collision2D col) { //Enemyとぶつかった時にコルーチンを実行 if (col.gameObject.tag == "Enemy") { StartCoroutine("Damage"); } } IEnumerator Damage() { //レイヤーをPlayerDamageに変更 gameObject.layer = LayerMask.NameToLayer("PlayerDamage"); //while文を10回ループ int count = 10; while (count > 0) { //透明にする renderer.material.color = new Color(1, 1, 1, 0); //0.05秒待つ yield return new WaitForSeconds(0.05f); //元に戻す renderer.material.color = new Color(1, 1, 1, 1); //0.05秒待つ yield return new WaitForSeconds(0.05f); count--; } //レイヤーをPlayerに戻す gameObject.layer = LayerMask.NameToLayer("Player"); }

}
Playerから出るミサイルのscript
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class PlayerMissile : MonoBehaviour
{

public LayerMask groundLayer; public GameObject Missile; public int shotCount; public Text shellLabel; private Rigidbody2D rigidbody2D; private Animator anim; private bool isGrounded; void Start() { anim = GetComponent<Animator>(); rigidbody2D = GetComponent<Rigidbody2D>(); shellLabel.text = "Missile:" + shotCount; } void Update() { if (Input.GetKeyDown("e")) { if (shotCount < 1) return; // ★追加 shotCountの数値を1ずつ減らす。 shotCount -= 1; // ★追加 shellLabel.text = "Missile:" + shotCount; anim.SetTrigger("Shot"); Instantiate(Missile, transform.position + new Vector3(0.4f, 1.2f, 0f), transform.rotation); // ショット音を鳴らす //GetComponent<AudioSource>().Play(); } } public void AddShell(int amount) { shotCount += amount; shellLabel.text = "Missile:" + shotCount; }

}

試したこと

武器の切り替えについて調べた。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gurz1019_MP

2018/11/26 14:12

確認なのですが、現状では「Space」を押すと通常弾、「e」を押すとミサイルが発射される、ということであっていますでしょうか? またこれを「e」を押すと武装の切り替え、「Space」で通常弾またはミサイルの発射という形にしたい、ということでしょうか?
Kamizaki_H_ARIA

2018/11/26 15:27

はい、どこかのキーを取得し、武器の切り替えを行いたいと考えてます
guest

回答2

0

私が思いついた方法を書きます。なお、PlayerMissileはPlayerScriptと同じGameObjectにアタッチされているものと考えています。
0. ミサイルと同じように、通常弾を表すコンポーネント(PlayerBullet等)を作る。
ミサイルと通常弾を同じ”武器”として扱いたいので、ミサイルがコンポーネントとしてPlayerScriptから分離されているなら、通常弾も同じように作ります。StartやUpdateで何もやることがなければ書かなくても構いません。
0. 武器を表すインターフェイス(IWeapon等)を作り、これに発射を表すメソッド(Fire等)を定義する。
これらの武器を同じように扱えるようインターフェイスを定義します。これらの武器は”撃つ”ことができるので、この操作をメソッドとして定義します。引数などは必要に応じて定義してください。
0. PlayerBulletおよびPlayerMissileにIWeaponインターフェイスを実装する。
ここが重要です。PlayerBulletとPlayerMissileにIWeaponインターフェイスを実装し、それぞれのFireメソッドに、PlayerScriptの通常弾とPlayerMissileのミサイルの発射処理周り(Instantiate周辺)を移動します。キーの判定は不要です。PlayerMissileのUpdateは何もしなくなります。
0. PlayerScriptに現在装備中の武器を表す変数(currentWeapon等)を定義する。
PlayerScriptにIWeapon型の変数を定義します。先程作った2つの武器は両方このインターフェイスを実装しているので、この変数には両方のコンポーネントを入れることができます。同時にはどちらか一つしか入りません。
0. PlayerScriptにプレイヤーが装備可能な武器の一覧を表す変数(Weapons等)を定義する。
PlayerScriptのStart等で、PlayerBulletコンポーネントとPlayerMissileコンポーネントを取得しておきます。anim等と同じ要領で良いです。型はIWeaponでもPlayerBulletなどでも良いですが、前者であればコレクションが使えます。
0. 各種初期化
PlayerScriptのStart等で初期のcurrentWeaponをWaponsから設定します。
0. 武器を変更
適当なキーを押したタイミングで、currentWeaponにWeaponsのどれかを代入します。
0. 撃つ
適当なキーを押したタイミングで「currentWeapon.Fire()」で撃てます。

こんな感じでしょうか。これで上手く動けば、武器を増やすことも簡単にできます。動作確認ができていないので、不備や不都合があれば返信してください。

投稿2018/11/26 17:24

Gurz1019_MP

総合スコア196

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kamizaki_H_ARIA

2018/11/27 08:05

回答ありがとうございます。最近unityとプログラミングを始めたばかりなので、少しずつ調べてやってみます。ありがとうございました。
guest

0

ベストアンサー

色々直した方が良い点はありますが多く指摘しても大変そうなので質問だけに答えると、
bool変数でも用意して「どこかのキーを取得」で切り替えて特定の弾しか出せないようにしてしまえば良いかと思います。

投稿2018/11/27 02:11

編集2018/11/27 02:14
Hawn

総合スコア1222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Kamizaki_H_ARIA

2018/11/27 07:39

回答ありがとうございます、他にどのような訂正箇所があるか教えて欲しいです。まだunityを始めたばかりで、サイトを参考に作っていて、どこが変更した方が良いかが分かりません。
Hawn

2018/11/27 08:20 編集

Gurz1019_MPさんが書いている様にクラス設計を見直して可読性と拡張性を改善するのが将来的には大切ですが、個人的にはソースコードをcodeブロックで囲んで投稿してくれれば十分です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問