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

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

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

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

Unity

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

Q&A

解決済

3回答

1186閲覧

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

kensirou

総合スコア17

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/13 11:33

前提・実現したいこと

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

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

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

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

C♯

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class UnityCyanController : MonoBehaviour 6{ 7 //Rigidbodyを変数に入れる 8 Rigidbody rb; 9 10 //スピード 11 public float speed = 3.0f; 12 13 14 //Animatorを入れる変数 15 private Animator animator; 16 17 //ユニティちゃんに位置を入れる 18 Vector3 playerPos; 19 20 21 22 GameObject Player; 23 GameObject LeftWall; 24 GameObject RightWall; 25 GameObject BottomWall; 26 GameObject TopWall; 27 28 Vector3 LeftPos; 29 Vector3 RightPos; 30 Vector3 BottomPos; 31 Vector3 TopPos; 32 33 34 //Can the player drop bombs? 35 public bool canDropBombs = true; 36 37 //Prefabs 38 public GameObject bombPrefab; 39 40 //爆弾個数制限 41 public int MaxBomb; 42 43 //Is this player dead? 44 public bool dead = false; 45 46 47 48 49 // Use this for initialization 50 void Start() 51 { 52 Player = GameObject.Find("Player"); 53 LeftWall = GameObject.Find("LeftWall"); 54 RightWall = GameObject.Find("RightWall"); 55 BottomWall = GameObject.Find("BottomWall"); 56 TopWall = GameObject.Find("TopWall"); 57 58 LeftPos = LeftWall.transform.position; 59 RightPos = RightWall.transform.position; 60 BottomPos = BottomWall.transform.position; 61 TopPos = TopWall.transform.position; 62 63 64 //Rigidbodyを取得 65 rb = GetComponent<Rigidbody>(); 66 67 //ユニティちゃんのAnimatorにアクセスする 68 animator = GetComponent<Animator>(); 69 70 //ユニティちゃんの現在より少し前の位置を保存 71 playerPos = transform.position; 72 73 } 74 75 76 77// Update is called once per frame 78 void Update() 79 { 80 if (Input.GetKeyDown(KeyCode.Space)) 81 { //爆弾を生成 82 DropBombs(); 83 } 84 85 86 87 //移動範囲の制限 88 Player.transform.position = (new Vector3 89     (Mathf.Clamp(Player.transform.position.x, LeftPos.x, RightPos.x), 90     transform.position.y, 91    Mathf.Clamp(Player.transform.position.z, BottomPos.z, TopPos.z)) 92    ); 93 94 95  //A・Dキー、←→キーで横移動 96 float x = Input.GetAxisRaw("Horizontal") * Time.deltaTime * speed; 97 98 //W・Sキー、↑↓キーで前後移動 99 float z = Input.GetAxisRaw("Vertical") * Time.deltaTime * speed; 100 101 //現在の位置+入力した数値の場所に移動する 102 rb.MovePosition(transform.position + new Vector3(x, 0, z)); 103 104 105 //ユニティちゃんの最新の位置から少し前の位置を引いて方向を割り出す 106 Vector3 direction = transform.position - playerPos; 107 108 //移動距離が少しでもあった場合に方向転換 109 if (direction.magnitude > 0.01f) 110 { 111 //directionのX軸とZ軸の方向を向かせる 112 transform.rotation = Quaternion.LookRotation(new Vector3 113 (direction.x, 0, direction.z)); 114 115 //走るアニメーションを再生 116 animator.SetBool("Running", true); 117 } 118 else 119 { 120 //ベクトルの長さがない=移動していない時は走るアニメーションはオフ 121 animator.SetBool("Running", false); 122 } 123 124 125 //ユニティちゃんの位置を更新する 126 playerPos = transform.position; 127 128 129 130 } 131 132 133 private void DropBombs() 134 { 135 136 if (bombPrefab) 137 { 138 // X 座標と z 座標を四捨五入 139 float x = Mathf.RoundToInt(transform.position.x); 140 float z = Mathf.RoundToInt(transform.position.z); 141 transform.position = new Vector3(x, 0, z); 142 143 144 145 // 爆弾のゲームオブジェクトを生成 146 Instantiate 147 ( 148 bombPrefab, 149 transform.position, 150 bombPrefab.transform.rotation 151 ); 152 153 154 155 //フィールド上の爆弾の数を取得 156 int BombCount = GameObject. 157 FindGameObjectsWithTag("BombItem").Length; 158 159 BombCount += 1; 160 161 //を解くと再生でバグる 162 163 //MaxBombとDropBombsの数が一緒なら爆弾生成出来ず 164 if (MaxBomb == BombCount) 165 { 166 bool canDropBombs = false; 167 } 168 169

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

試したこと

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

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

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

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

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

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

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

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

C#

1private void DropBombs() 2{ 3 //フィールド上の爆弾の数を取得 4 int BombCount = GameObject. 5 FindGameObjectsWithTag("BombItem").Length; 6 7 // 爆弾を設置可能か判定 8 if (BombCount < MaxBomb) 9 { 10 if (bombPrefab) 11 { 12 // X 座標と z 座標を四捨五入 13 float x = Mathf.RoundToInt(transform.position.x); 14 float z = Mathf.RoundToInt(transform.position.z); 15 transform.position = new Vector3(x, 0, z); 16 17 // 爆弾のゲームオブジェクトを生成 18 Instantiate 19 ( 20 bombPrefab, 21 transform.position, 22 bombPrefab.transform.rotation 23 ); 24 } 25 } 26} 27

投稿2018/11/13 15:37

Gurz1019_MP

総合スコア196

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

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

Bongo

2018/11/13 21:12

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

2018/11/15 03:12

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

2018/11/15 14:10

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

0

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

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

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

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

投稿2018/11/13 15:04

編集2018/11/13 15:07
YOshim

総合スコア1085

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

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

kensirou

2018/11/15 03:13

BombCount += 1; は要りませんでした。 ご指摘ありがとうございます。
guest

0

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

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

投稿2018/11/13 12:03

papinianus

総合スコア12705

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

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

kensirou

2018/11/13 12:19

MaxBombに関してはスクリプト上では指定してませんが、Inspector上では1と設定しております。スクリプト上で書いたほうがよろしいでしょうか? private void DropBombs() 内の Instantiate ( bombPrefab, transform.position, bombPrefab.transform.rotation ); DropBomb-= 1; if(DropBomb < 1) return; と書いてたと思います。 うろ覚えですみません。
papinianus

2018/11/13 12:27 編集

Maxが1なんですよね?処理を見ると爆弾を1個置いたあとに爆弾のカウントを一つ増やしてMaxと比較しているようにみえます。つまりこのロジックではBombCountは2以上の値しかとらないので、Maxが1だと永久に=になりそうにないです。 +=1をやめてはどうですか? -=しているDrooBombって何のカウンタですか?それは爆発後に+=してますか?
kensirou

2018/11/13 13:23

あとあとの事も考えて書いたのですが、MaxBomb=1の場合は意味がないんですね。方向性を変えてみます。 -=に関しては、引用を引っ張ってきて書いてたもので、全然論理的に考えていませんでした。今は書いておりません。 Instantiateで次々に生成されるという考え方でいたので、爆発後+=にというのは考えておりませんでした。 +=ですと、if文で爆弾が爆発したら生成可能というようなスクリプトということでしょうか?
papinianus

2018/11/13 14:56

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

2018/11/15 03:25

その推測で概ねあってはいたのですが、なかなか思うようなスクリプトが書けませんでした。 他の方のアンサーで解決は致しました。 papinianusさんにおかれましては、こんな自分の問題解決のために何度もコメント下さり本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問