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

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

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

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Unity

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

Q&A

解決済

2回答

12721閲覧

Unityでのクリックによるオブジェクトの消去 C#

back_g_m

総合スコア11

C#

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Unity

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

0グッド

2クリップ

投稿2017/03/12 15:26

編集2017/03/12 15:36

初めてこちらで質問します。
現在、Unity5.5.1でC#を使用して
2Dゲームを作ろうとしています。

whiteというゲームオブジェクトをマウスでクリックしたときに
消えるという動作を行いたいと思っています。

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

エラーメッセージ

###該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CatController: MonoBehaviour { public GameObject white; // Use this for initialization void Start () { this.white = GameObject.Find ("white"); } // Update is called once per frame void Update () {//左クリックをしたとき if (Input.GetMouseButtonDown (0)) { //スクリーンから見たマウスの座標を得る Vector2 tapPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition); //コライダーを持つオブジェクト=クリックされた場所の座標 Collider2D collider = Physics2D.OverlapPoint (tapPoint); //このwhiteはコライダーのGameObjectとしての値を取得 this.white = collider.transform.gameObject; Destroy (gameObject); } } }

###補足情報(言語/FW/ツール等のバージョンなど)
C#/Unity5.5.1

全くの初心者なので、文法がおかしいことになっていると思います。
サイトや書籍をまわってみたのですが、どこがどうおかしいかもいまいち理解できていません。
どのように質問するべきかもわかっておらず、恥ずかしい限りですが
ご指導いただけたなら幸いです。
よろしくお願いいたします。

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

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

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

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

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

Zuishin

2017/03/12 15:31

「編集」をクリックして編集画面に入り、コード部分(using 以降、最後の中カッコまで)を選択し、<code> をクリックして右側のプレビューを見ながらインデントを設定しなおしてください。
back_g_m

2017/03/12 15:37

ありがとうございます。編集しました。
guest

回答2

0

ベストアンサー

Destroy (gameObject);
これでは「このスクリプト(CatController)が付いたGameObject」を消去してしまいます。
Destroy (this.white);
whiteオブジェクトを消したいならこうする必要があります。


また、タップした時にcolliderが取得出来ない可能性があり(オブジェクトが無い場所をタップした場合など)、その場合はこのスクリプトだとエラーになります。
以下のようにif文を入れるべきでしょう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CatController: MonoBehaviour 6{ 7 public GameObject white; 8 9 // Use this for initialization 10 void Start () 11 { 12 this.white = GameObject.Find ("white"); 13 14 } 15 16 // Update is called once per frame 17 void Update () 18 {//左クリックをしたとき 19 if (Input.GetMouseButtonDown (0)) { 20 //スクリーンから見たマウスの座標を得る 21 Vector2 tapPoint = Camera.main.ScreenToWorldPoint (Input.mousePosition); 22 //コライダーを持つオブジェクト=クリックされた場所の座標 23 Collider2D collider = Physics2D.OverlapPoint (tapPoint); 24 25 //変更:コライダーが取得出来た時だけ処理する 26 if (collider != null) { 27 //このwhiteはコライダーのGameObjectとしての値を取得 28 this.white = collider.transform.gameObject; 29 Destroy (this.white); 30 } 31 } 32 } 33}

(もしwhite以外にもCollider2Dを持つオブジェクトがあるなら、「クリックされたのがwhiteオブジェクトなのかどうか」の判定も合わせて入れるといいと思います。現状のスクリプトではクリックされたオブジェクトがwhiteでなくても消去してしまいます)

投稿2017/03/13 00:09

sakura_hana

総合スコア11427

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

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

back_g_m

2017/03/13 01:48

ありがとうございます。 うまく動作しました。 オブジェクトがある場所、ない場所の区別が必要なのですね。 勉強になりました。
sakura_hana

2017/03/13 01:54

正確に言うと「colliderがnullかそうでないか」の区別が必要です。 (Collider2Dが無い場所をクリックする→ Collider2Dが取得出来ない→colliderにnullが入ります) 今回に限ったことではなく、どんなコードでもそうなのですが、 「collider.transform.gameObject」などと「.」で変数が繋がっている場合、「.」の左側の変数がnullだとエラーが出ます。 なのでcolliderがnullだったら処理を実行させないようにしましょう、という話です。
back_g_m

2017/03/13 02:18

コライダーでの区別なのですね。 オブジェクトでの区別はできるのでしょうか? 色々調べてみたいと思います。
guest

0

Update でなく OnMouseDown を試してみてください。

投稿2017/03/12 15:41

Zuishin

総合スコア28660

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

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

back_g_m

2017/03/13 01:53 編集

ありがとうございます。 void内の文を変えたところ、 Update、OnMouseDownのどちらでも動作しました。 勉強になります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問