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

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

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

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

Unity3D

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

Q&A

解決済

1回答

815閲覧

プレイヤーがスイッチに接触したら壁が壊れるスクリプトを作りたい

tyunsan

総合スコア5

C#

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

Unity3D

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

0グッド

0クリップ

投稿2021/06/27 08:40

編集2021/06/27 10:52

プレイヤーがスイッチに接触したら壁が壊れるスクリプトを作りたいのですが、何故かUnityが実行出来ない(最後の行のDestroyObjectでエラーが出ます)です。どこをどう直せば良いか教えて頂けませんでしょうか。

c#

1コードusing System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5/*! 6 * 他のオブジェクトがぶつかった時に、ぶつかったオブジェクトを削除します。 7 */ 8public class Destroy : MonoBehaviour 9{ 10 [Tooltip("当たり判定の対象として認識するオブジェクトのタグ")] 11 public string targetTag = ""; 12 13 [Tooltip("ぶつかった時にこのオブジェクトを削除するか")] 14 public bool DestroyThisObject = true; 15 16 [Tooltip("ぶつかった時にぶつかったオブジェクトを削除するか")] 17 public bool DestroyThatObject = true; 18 19 void Reset() 20 { 21 targetTag = ""; 22 } 23 24 void DestroyObject(GameObject obj) 25 { 26 if (DestroyThatObject) { 27 GameObject.Destroy(obj); 28 } 29 if (DestroyThisObject) { 30 GameObject.Destroy(this.gameObject); 31 } 32 33 } 34 35 void OnTriggerEnter(Collider other) 36 { 37 if(other.gameObject.CompareTag("switch")) 38 { 39 DestroyObject(other.gameObject.CompareTag("Wall")); 40 } 41 } 42} 43 44 45

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/06/27 10:25

「Unityが実行できない」とはどういう状況でしょうか? スクリプトを実行するとエラーが出て止まるのか、そもそも実行する前にエラーが出ているのか、そこを明記しないと解決には至らないと思いますよ。
guest

回答1

0

ベストアンサー

以下に誤りがあるので、コンパイルエラーで実行できないのではないでしょうか。

※実際の作りは把握していないので、エラーの解決方法だけ提示させて頂きます。
意図した動きにならないという場合は、別質問を立てて頂ければと思います。

C#

1void OnTriggerEnter(Collider other) 2{ 3 if(other.gameObject.CompareTag("switch")) 4 { 5 // 説明: 6 // "DestroyObject"メソッドの引数は「GameObject」になっています。 7 // 現在はBool値を渡す様になっているので、GameObjectを渡す様に修正すればエラーは解決するのではないでしょうか。 8 9 // 誤 :DestroyObject(other.gameObject.CompareTag("Wall")); 10 DestroyObject(other.gameObject); 11 } 12}

追記
コメント頂きましたが、提示されているスクリプトとオブジェクトの全体像が把握できていないので、
一番簡潔にできそうな方法を記載させて頂きます。
提示されてるスクリプト内のメソッドが意味なくなるかもなので、参考程度に見てください。。

C#

1void OnTriggerEnter(Collider other) 2{ 3 if (other.gameObject.CompareTag("switch")) 4 { 5 // "switch"というタグが付いたオブジェクトにぶつかったら、"Wall"というタグの付いたオブジェクトを検索して取得。 6 // For文でオブジェクト数分回して、オブジェクトを削除する 7 GameObject[] walls = GameObject.FindGameObjectsWithTag("Wall"); 8 foreach (GameObject obj in walls) { 9 GameObject.Destroy(obj); 10 } 11 } 12}

投稿2021/06/27 10:53

編集2021/06/27 14:23
tsuki01

総合スコア1751

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

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

tyunsan

2021/06/27 13:55

スイッチに接触した時にWallとタグ付けしたものをを消すにはどうすれば良いでしょうか
tsuki01

2021/06/27 14:24

回答に追記いたしました。 追記した通り、全体像が分かっていないので "Wall"とタグ付けしたものを検索後に直接削除する方法を提示させて頂きました。
tyunsan

2021/06/27 14:34

無事にコンパイルできたのですが、Wallとタグ付けしたオブジェクトが消えないのはなんでなんでしょうか。
tsuki01

2021/06/27 14:47 編集

消えない原因が複数考えられるので、デバッグログを追加して、どこまで処理が進んでいるかご確認願います。 1、OnTriggerEnterメソッドは呼ばれてますか? 2、if (other.gameObject.CompareTag("switch"))〜 の条件文の中は呼ばれていますか? 3、本当にタグ名は合っていますか?(大文字、小文字の区別がちゃんとついているかなど)
tyunsan

2021/06/27 15:03

デバッグログ通したのですが、全文通っていました。タグも大丈夫でした。 もしかしてswitchのTarget TagをPlayerにしてることが問題でしょうか
tsuki01

2021/06/27 15:12

TargetTagの役割が分からないのですが、ログで全文通っているなら関係ないはずです。 ログで、以下の中まで通ってたんですよね? if (other.gameObject.CompareTag("switch")) { // ここまで入っている? } もしくは、以下でWallタグの付いたオブジェクトを取得した後に、配列のカウント数をデバッグログで出力してみてください。0件以上になっていますか? GameObject[] walls = GameObject.FindGameObjectsWithTag("Wall"); Debug.Log(walls.Length); // ちゃんと0件以上になっている?
tyunsan

2021/06/27 15:29

すいません、解決できました。if分の中のCompareTag("switch")を("Player")にしたら無事できました。自分の拙い文章で分かりづらくてすいませんでした。同時にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問