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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

4775閲覧

オブジェクトが全て消えたらゲームクリアにしたい

yume0409

総合スコア45

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

1グッド

1クリップ

投稿2021/06/19 08:49

編集2021/06/19 09:29

#やりたいこと
ブロック崩しを作成していて、ブロックが全て消えたら
ゲームクリアにしたいです。
Scene遷移は出来ていますが、全て消えた時に切り替わりません。
#試したこと

public class Block : MonoBehaviour { private GameObject[] BlockObjects; void Update() { BlockObjects = GameObject.FindGameObjectsWithTag("Block"); if (BlockObjects.Length == 0) { SceneManager.LoadScene("GameClear"); } } }

Blocktagを作成し、タグが0になった時にシーンが切り替わってほしいです。
一度

if (BlockObjects.Length == 1)

全て消えた時にではなく、1つだけタグがある時にバージョンもやってみましたが、
これなら成功します。
ただ、プログラムにあるように1つ残った状態で遷移されます。
1が0になった時だけ遷移されません。
原因分かる方いましたら教えて下さい。
お願いします。

#追加

BlockObjects = GameObject.FindGameObjectsWithTag("Block");

した時にエラーは出ません。

void Update() { BlockObjects = GameObject.FindGameObjectsWithTag("Block"); if (BlockObjects.Length == 11) //全部消えたら表示されないので残り11個になった時に表示 { Debug.Log(BlockObjects); } }

ブロックの残り数が11個になった時にDebug.Logをしてみました。
結果

UnityEngine.GameObject[] UnityEngine.Debug:Log (object)

多分、何も格納されてない?と思います。

unitybeginner👍を押しています

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

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

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

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

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

YAmaGNZ

2021/06/19 09:06

ブロックが全部消えたから動いているスクリプトもないのでは?
ku__ra__ge

2021/06/19 09:12

タグが0になったときに BlockObjects = GameObject.FindGameObjectsWithTag("Block"); を実行すると、何かエラーが発生しますか? エラーが発生しない場合、BlockObjects には何が格納されてしますか?(Debug.Log(BlockObjects);で確認できると思います。)
YAmaGNZ

2021/06/19 10:23 編集

このスクリプトってブロックにアタッチされているのですよね? そのアタッチされているブロックが全部消えたらスクリプトも動かないのではないのですか? それともこのスクリプトは消えるブロックではなく他のオブジェクトにアタッチされているのですか?
yume0409

2021/06/19 10:32

消えるブロックにスクリプトはついています。 勉強不足で理解できないのですが、 何故、全部消えたらスクリプトは動かないのでしょうか?
YAmaGNZ

2021/06/19 10:53

多分、ブロックを消すときはDestroyを使っているかSetActive(false)を使っているのだと思います。 これらを使って非表示にすると、そのオブジェクトにアタッチされているスクリプトの動作も止まります。 なので、最後のブロックを消すとブロックにアタッチされているスクリプトの動作が止まりUpdateが呼ばれなくなります。 なので、Update内でブロックが0か判断しようとしても、そもそもその部分が動いてないので判断が出来ません。
yume0409

2021/06/19 12:04

ありがとうございます! 勉強になりました!
guest

回答1

0

ベストアンサー

このスクリプトはブロック崩しブロックにくっついて動いていますか?もしそうであれば動かないでしょう。

プログラムもまたデータです。もしブロックが消えてしまったら、そのブロック(ゲームオブジェクト)にくっついているデータ(コンポーネント)も消えてしまいます。

cs

1public class Block : MonoBehaviour { 2 // 質問者が書いたコード 3}

と書いたデータも消えてしまいます。(正確にはちょっと違いますが。無くなってしまうのはBlockクラスのインスタンスです) 消えてしまえば動かなくなるのは当然ですよね?

つまり、ブロック崩しのブロックが消えてしまったとき、そのブロック崩しのスクリプトのデータもぜーんぶなくなってしまうので、動かなくなるというわけです。

あと、

ブロックの残り数が11個になった時にDebug.Logをしてみました。
結果

cs

1 2UnityEngine.GameObject[] 3UnityEngine.Debug:Log (object)

多分、何も格納されてない?と思います。

「ブロックの残り数が11個になった時にDebug.Logをしてみました。」というのができている以上は何か格納されているはずですよ。

また、

cs

1Debug.Log(BlockObjects);

というコードで出力しているとすれば、Debug.Logがもし文字列以外のデータであれば。ToStringを呼び出しています。つまり

cs

1Debug.Log(BlockObjects.ToString());

というコードと同等です。そして、BlockObjectsはGameObject[]と表示されているのであれば、単にBlockObjectsはゲームオブジェクトの配列であるだけで、配列の中身のデータが入っているかどうかとは関係がありません。

投稿2021/06/19 11:22

nobkz

総合スコア320

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

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

yume0409

2021/06/19 12:11

回答ありがとうございます! 最初、ブロックにスクリプトつけてたら何故、全部消えた時に切り替わらないか不思議で たまりませんでしたが、回答者様のお陰で理解出来ました! 新にオブジェクトとスクリプトを作成し、それに上記のコードそのままアタッチすると 無事、解決出来ました。 あと、配列の件は Debug.Log(BlockObjects); と入力すると UnityEngine.GameObject[] UnityEngine.Debug:Log (object) としかならないのですが、何故でしょうか?
nobkz

2021/06/19 20:37

配列の件は既にお答えした通りです。 もう一度説明しますと。 Debug.Logの出力は基本的に引数を文字列にして表示します。つまりToStringが呼ばれるわけです。 Debug.Log(BlockObjects)はつまりDebug.Logの処理の中で、BlockObjects.ToString()というメソッドが呼ばれます。だから、Debug.Log(BlockObjects)と書いたらDebug.Log(BlockObjects.ToString())と書いたのとほぼ同じ意味になります。 で、BlockObjects.Tostring()が呼ばれていることは話しました。じゃあこれがどのような文字列を返すのか?という問題になります。 BlockObjectsはGameObject[]のデータ型ですよね?そのデータ型は、Object.ToStringをおそらくオーバーライドしていないために、Object.ToStringメソッドが呼ばれます。 基本的にObject.ToString()はそのオブジェクトのデータ型を文字列で表現するはずです。つまりBlockObjects.ToString()はBlockObjectsのデータ型を表した文字列を返します。BlockObjectsのデータ型は何度も言いますが、GameObjects[]です。 よって、Debug.Log(BlockObjects)は基本的には、BlockObjectsのデータ型しか表示しません。以上です。
yume0409

2021/06/20 15:09

ありがとうございます! 勉強になります!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問