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

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

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

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

Unity

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

Q&A

解決済

1回答

6616閲覧

Unityで複数用意したオブジェクトをクリックするたびに画像を交互に切り替えたい

Z_Silver

総合スコア27

C#

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

Unity

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

0グッド

1クリップ

投稿2017/12/08 16:23

編集2017/12/09 09:41

###前提・実現したいこと
Unity2Dにて、「点線ブロック」と「四角ブロック」の画像を用意し、
クリックするたびに交互に切り替わる物を作成し実行した際、単体では
問題なく動作したのですが複数(複製や、プレファブ等)用意して使うと
途中でクリックしても画像が切り替わらないオブジェクトが出てきており
原因がわからない状態です。

回答よろしくお願いします。

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

public GameObject Block; private bool isTap = false; void Start () { //ブロックの画像を非表   Block.SetActive (false); } void Update () { GameObject obj = getClickObject (); //以下オブジェクトがクリックされた時の処理 if (obj != null) { //クリック事に画像を切り替える if (isTap) { Block.SetActive (true); } else { Block.SetActive (false); } } } // 左クリックしたオブジェクトを取得する関数 private GameObject getClickObject() { GameObject result = null; // 左クリックされた場所のオブジェクトを取得 if(Input.GetMouseButtonDown(0)) { Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); Collider2D collider2d = Physics2D.OverlapPoint(tapPoint); if (collider2d) { result = collider2d.transform.gameObject; if (result.name == this.name) { isTap = true; } else if (result.name == Block.name) { isTap = false; } } } return result; } } ``` ###補足情報(言語/FW/ツール等のバージョンなど) Unity 5.5 言語:C# 画像は点線ブロックを親、四角ブロックを子に設定しています オブジェクトが単体(1個)だと問題なく動作しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

C#

1 if (result.name == this.name) 2 { 3 isTap = true; 4 } 5 else if (result.name == Block.name) 6 { 7 isTap = false; 8 }

上記の箇所において、同名のオブジェクトが複数存在する場合、意図した動作にならないでしょう。

また、おそらく親ブロックにこのスクリプトをアタッチしていると思いますが、そうすると親ブロックの数だけ当たり判定が動くため非効率です。
空のオブジェクトをシーン上に1個だけ作成し、それに以下のスクリプトをアタッチするのはどうでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class GetClick : MonoBehaviour 6{ 7 void Update() 8 { 9 getClickObject(); 10 } 11 12 // 左クリックしたオブジェクトを取得する関数 13 // 返り値は不要なため、削除 14 private void getClickObject() 15 { 16 // 左クリックされた場所のオブジェクトを取得 17 if (Input.GetMouseButtonDown(0)) 18 { 19 Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); 20 Collider2D collider2d = Physics2D.OverlapPoint(tapPoint); 21 22 if (collider2d) 23 { 24 GameObject result = collider2d.transform.gameObject; 25 26 // この時点で1つのオブジェクトに絞られているため、名前で判断してもここでは問題はありません 27 // ただ、複製すると名前の末尾に「 (Clone)」と付いてしまうため、複製時に毎回名前を設定するか、 28 // 名前の代わりにTagを使うとよいでしょう 29 if (result.name == "ParentBlock") 30 { 31 // 子ブロックを取得 32 result = result.transform.Find("ChildBlock").gameObject; 33 } 34 if (result.name == "ChildBlock") 35 { 36 // 子ブロックが無効なら有効、有効なら無効にする 37 result.SetActive(!result.activeSelf); 38 } 39 } 40 } 41 } 42}

親ブロックのスクリプトは不要ですが、子ブロックのゲームオブジェクトをデフォルトで無効にしておいてください。


ソースコードは「```」×2で囲むと見やすくなります。

投稿2017/12/09 02:14

fiveHundred

総合スコア9739

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

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

Z_Silver

2017/12/09 10:09 編集

ご回答ありがとうございます。 無事問題が解決しました。 ソースコードの見出しについても助言していただき、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問