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

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

ただいまの
回答率

88.64%

【Unity】ボンバーマン制作における、爆弾の生成個数の制限(C♯)

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,107

kensirou

score 17

 前提・実現したいこと

アイテム取得における爆弾生成個数の制限

ここに質問の内容を詳しく書いてください。

最初に、拙いスクリプトである事をお詫びいたします。ですが、何卒ご尽力をお願いいたします。

ただいまUnityにおいてボンバーマンを制作しています。
他の方のブログなどを見て、Playerが爆弾を生成することは出来ております(スペースキーで生成)。
ですが、今のままですと、ゲーム開始時から何個も爆弾を出せてしまうため、自分の作りたいボンバーマンではなくなってしまいます。
ですので、最初はいくらスペースキーを押したとしても1個しか生成されないようにしたいです。
スクリプト上にて、生成可能限界数を「MaxBomb」と名付け、最初に宣言しています。
フィールド上に置いた爆弾を「BombCount」と名付けました。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UnityCyanController : MonoBehaviour
{
    //Rigidbodyを変数に入れる
    Rigidbody rb;

    //スピード
    public float speed = 3.0f;


    //Animatorを入れる変数
    private Animator animator;

    //ユニティちゃんに位置を入れる
    Vector3 playerPos;



    GameObject Player;
    GameObject LeftWall;
    GameObject RightWall;
    GameObject BottomWall;
    GameObject TopWall;

    Vector3 LeftPos;
    Vector3 RightPos;
    Vector3 BottomPos;
    Vector3 TopPos;


    //Can the player drop bombs?
    public bool canDropBombs = true;

    //Prefabs
    public GameObject bombPrefab;

    //爆弾個数制限
    public int MaxBomb;

    //Is this player dead?
    public bool dead = false;




    // Use this for initialization
    void Start()
    {
        Player = GameObject.Find("Player");
        LeftWall = GameObject.Find("LeftWall");
        RightWall = GameObject.Find("RightWall");
        BottomWall = GameObject.Find("BottomWall");
        TopWall = GameObject.Find("TopWall");

        LeftPos = LeftWall.transform.position;
        RightPos = RightWall.transform.position;
        BottomPos = BottomWall.transform.position;
        TopPos = TopWall.transform.position;


        //Rigidbodyを取得
        rb = GetComponent<Rigidbody>();

        //ユニティちゃんのAnimatorにアクセスする
        animator = GetComponent<Animator>();

        //ユニティちゃんの現在より少し前の位置を保存
        playerPos = transform.position;

    }



// Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        { //爆弾を生成
            DropBombs();
        }



        //移動範囲の制限
        Player.transform.position = (new Vector3
                (Mathf.Clamp(Player.transform.position.x, LeftPos.x, RightPos.x),
                 transform.position.y,
                  Mathf.Clamp(Player.transform.position.z, BottomPos.z, TopPos.z))
                  );


           //A・Dキー、←→キーで横移動
            float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * speed;

            //W・Sキー、↑↓キーで前後移動
            float z = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed;

            //現在の位置+入力した数値の場所に移動する
            rb.MovePosition(transform.position + new Vector3(x, 0, z));


            //ユニティちゃんの最新の位置から少し前の位置を引いて方向を割り出す
            Vector3 direction = transform.position - playerPos;

        //移動距離が少しでもあった場合に方向転換
        if (direction.magnitude > 0.01f)
        {
            //directionのX軸とZ軸の方向を向かせる
            transform.rotation = Quaternion.LookRotation(new Vector3
                (direction.x, 0, direction.z));

            //走るアニメーションを再生
            animator.SetBool("Running", true);
        }
        else
        {
            //ベクトルの長さがない=移動していない時は走るアニメーションはオフ
            animator.SetBool("Running", false);
        }


        //ユニティちゃんの位置を更新する
        playerPos = transform.position;



    }


    private void DropBombs()
    {

        if (bombPrefab)
        {
            // X 座標と z 座標を四捨五入
            float x = Mathf.RoundToInt(transform.position.x);
            float z = Mathf.RoundToInt(transform.position.z);
            transform.position = new Vector3(x, 0, z);



            // 爆弾のゲームオブジェクトを生成
            Instantiate
        (
            bombPrefab,
            transform.position,
            bombPrefab.transform.rotation
        );



            //フィールド上の爆弾の数を取得
            int BombCount = GameObject.
                            FindGameObjectsWithTag("BombItem").Length;

            BombCount += 1;

            //を解くと再生でバグる

            //MaxBombとDropBombsの数が一緒なら爆弾生成出来ず
            if (MaxBomb == BombCount)
            {
                bool canDropBombs = false;
            }

現在何個も生成可能な状態となっております。
アイテム取得時に取得数によって生成できる爆弾の個数が増えていくようにもしたいのですが、まずは1個だけ出て、爆発して消えればまた生成可能になるようにしたいです・

 試したこと

https://mono-pro.net/archives/4916

上記のサイトで  
if(shotCount < 1)
return;

を使用したところ、爆弾が1個しか生成されませんでしたが、爆発後に次の爆弾が出てきませんでした。

「private IEnumerator」「 yield return」などを使うのかとも思いましたが、書き方がわかりませんでした。

 補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

はじめまして、初めて回答させていただきます。
スクリプトを拝見しましたところ、爆弾を生成しているDropBombsメソッドの中では必ず爆弾を生成しているようなので、このメソッドの最初に爆弾が設置可能か判定してはいかがでしょうか。

具体的には以下のようなイメージです。なお動作確認はしていないため、意図している動作になるか定かではありません。

private void DropBombs()
{
    //フィールド上の爆弾の数を取得
    int BombCount = GameObject.
                    FindGameObjectsWithTag("BombItem").Length;

    // 爆弾を設置可能か判定
    if (BombCount < MaxBomb)
    {
        if (bombPrefab)
        {
            // X 座標と z 座標を四捨五入
            float x = Mathf.RoundToInt(transform.position.x);
            float z = Mathf.RoundToInt(transform.position.z);
            transform.position = new Vector3(x, 0, z);

            // 爆弾のゲームオブジェクトを生成
            Instantiate
            (
                bombPrefab,
                transform.position,
                bombPrefab.transform.rotation
            );
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/14 06:12

    Gurz1019_MPさんの案がシンプルでよさそうですので、1票入れたいですね。
    この形なら生きている爆弾だけがカウントされますので、YOshimさんのおっしゃるBombCountの操作が不要になって楽そうです。
    その他考慮するべき点としては、同じ座標に複数の爆弾を設置することを許すか?とか、プレイヤー以外に爆弾を設置できるキャラクターがいるか(プレイヤーが設置した爆弾とそれ以外の爆弾を区別する必要があるか)?といったことでしょうかね。

    キャンセル

  • 2018/11/15 12:12

    爆弾が1個だけしか出ないようになりました。
    爆発後にまた生成するスクリプトを書ければと思いますので、引き続きやってみます!

    ありがとうございました!

    キャンセル

  • 2018/11/15 23:10

    お力になれたようで何よりです。この先実装が進むとBongoさんの仰るような懸念事項が出てくると思いますが、このメソッドの基本的なフローは変わらないのではと思います。頑張ってください

    キャンセル

0

MaxBombを宣言してますが個数を指定してないからでは?

shotCountはどこにどう書いたか示していただかないと分かりません。リセット処理してないのなーって感じ

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/13 22:23

    あとあとの事も考えて書いたのですが、MaxBomb=1の場合は意味がないんですね。方向性を変えてみます。

    -=に関しては、引用を引っ張ってきて書いてたもので、全然論理的に考えていませんでした。今は書いておりません。

    Instantiateで次々に生成されるという考え方でいたので、爆発後+=にというのは考えておりませんでした。
    +=ですと、if文で爆弾が爆発したら生成可能というようなスクリプトということでしょうか?

    キャンセル

  • 2018/11/13 23:56

    「+=で爆発したら生成可能」という意図で↑のコメントは書きました。一個置いてそれ以上置けないという部分的に意図した挙動ができた、しかし爆発しても置けるようにならなかったと書いておられたことと、-=されて1より小さいというifなどから、「爆発によって、フィールドに置いていい許容数が増えればいい」のではないかと推測しました。

    キャンセル

  • 2018/11/15 12:25

    その推測で概ねあってはいたのですが、なかなか思うようなスクリプトが書けませんでした。

    他の方のアンサーで解決は致しました。

    papinianusさんにおかれましては、こんな自分の問題解決のために何度もコメント下さり本当にありがとうございます。

    キャンセル

0

>爆弾が1個しか生成されませんでしたが、爆発後に次の爆弾が出てきませんでした。
爆弾が爆発したらBombCountを0にする処理を記述していますか。
爆弾が爆発するエフェクトがあるのかもしれませんが、画像がなくなっているだけでオブジェクトは存在しているとかではないでしょうか。

あと、BombCount += 1;って必要でしょうか。
int BombCount = ・・・の記述で個数がセットされますが、さらに1を加える必要はないのでは?

BombCountの値をログで確認するのが良いかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/15 12:13

    BombCount += 1;
    は要りませんでした。

    ご指摘ありがとうございます。

    キャンセル

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

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る