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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

1回答

760閲覧

クリックした位置のオブジェクト”のみ”、透明度を変更したい。(全部のオブジェクトが変更されてしまう。)

RTera

総合スコア11

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

1グッド

1クリップ

投稿2018/07/28 15:09

前提・実現したいこと

Unity2D(バージョン2017 1.0f3)で、
クリックした位置のオブジェクトのみ、透明度を変更したい。

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

Prefabで登録している SpriteRenderer のオブジェクトがすべて反映されてしまう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class StageManager : MonoBehaviour { 6 7 public GameObject block; 8 public SpriteRenderer spRenderBlock; 9 10 // Use this for initialization 11 void Start () { 12 this.block = GetComponent<GameObject>(); 13 this.spRenderBlock = GetComponent<SpriteRenderer>(); 14 } 15 16 // Update is called once per frame 17 void FixedUpdate() { 18 if (Input.GetMouseButtonDown(0)) 19 { 20 OnClickBlock(); 21 } 22 } 23 24 // マウスクリック、またはタップ 25 public void OnClickBlock() { 26 27 //スクリーンから見たマウスの座標を得る 28 Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); 29 //コライダーを持つオブジェクト=クリックされた場所の座標 30 Collider2D collider = Physics2D.OverlapPoint(tapPoint); 31 32 //Blockのコライダーが取得出来た時だけ処理する 33 if (collider != null && collider.name.Equals("Block")) { 34 //このBlockはコライダーのGameObjectとしての値を取得 35 this.block = collider.transform.gameObject; 36 SwitchBlockDisplay(collider); 37 38 } 39 } 40 41 // 表示状態を切り替える処理 42 private void SwitchBlockDisplay(Collider2D blockCollider) { 43 44 this.spRenderBlock.color = new Color(1f, 1f, 1f, 0.3f); 45 blockCollider.isTrigger = true; 46 47 } 48
carupota👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

コードを見るに、「StageManager」は個々のブロックにアタッチされているスクリプトということでいいでしょうか?

その前提で処理を想像してみますと、あるブロックをクリックした時、Input.GetMouseButtonDown(0)はマウスの位置にかかわらずtrueになりますので、シーン内の全ブロックが一斉にOnClickBlock();を実行するだろうと予想されます。

そして処理は一様にSwitchBlockDisplay(collider);へと進み、その中でthis.spRenderBlock.color = new Color(1f, 1f, 1f, 0.3f);によって自分自身の色を半透明に変えます。
どのブロックをクリックしようと、全ブロックがこの色変え処理まで到達してしまうので、すべてのブロックが一斉に半透明になってしまうのでしょう(何だかややこしい説明になってしまいすみません...)。

条件をちょっと変えて、このようにするとどうでしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class StageManager : MonoBehaviour { 6 7 public GameObject block; 8 public SpriteRenderer spRenderBlock; 9 10 // Use this for initialization 11 void Start() { 12 // GameObjectは「Component」ではないので、GetComponentでは取得できないかと思います 13 // blockは特に使用してはいないようですが、もし使いたい場合は「this.gameObject」で得られるでしょう 14 this.block = GetComponent<GameObject>(); 15 // Debug.Log(this.block); // コンソールに出力すると「null」になっているかと思います 16 this.spRenderBlock = GetComponent<SpriteRenderer>(); 17 } 18 19 // Update is called once per frame 20 // 「FixedUpdate」を使っているのには何か特別な理由があるのでしょうか? 21 // ここは「Update」のままのほうがいいかもしれません 22 // FixedUpdateだとOnClickBlockが複数回呼ばれたり、あるいは呼ばれなかったりする可能性がありそうです 23 // 参考1 https://forum.unity.com/threads/input-getmousebuttondown-and-fixedupdate.130051/ 24 // 参考2 http://unity-yuji.xyz/input-fixedupdate/ 25 void FixedUpdate() { 26 if (Input.GetMouseButtonDown(0)) { 27 OnClickBlock(); 28 } 29 } 30 31 // マウスクリック、またはタップ 32 public void OnClickBlock() { 33 //スクリーンから見たマウスの座標を得る 34 Vector2 tapPoint = Camera.main.ScreenToWorldPoint(Input.mousePosition); 35 //コライダーを持つオブジェクト=クリックされた場所の座標 36 Collider2D collider = Physics2D.OverlapPoint(tapPoint); 37 38 //Blockのコライダーが取得出来た時だけ処理する 39 // 条件を一部変更...「オブジェクトの名前がBlockであるか」ではなく、 40 // 「取得されたcolliderのgameObjectと、このスクリプトがアタッチされたオブジェクトが一致するか」とする 41 if (collider != null && collider.gameObject == this.gameObject) { 42 //このBlockはコライダーのGameObjectとしての値を取得 43 this.block = collider.transform.gameObject; 44 SwitchBlockDisplay(collider); 45 } 46 } 47 48 // 表示状態を切り替える処理 49 private void SwitchBlockDisplay(Collider2D blockCollider) { 50 this.spRenderBlock.color = new Color(1f, 1f, 1f, 0.3f); 51 blockCollider.isTrigger = true; 52 } 53}

投稿2018/07/28 22:19

Bongo

総合スコア10807

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

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

RTera

2018/07/28 23:54 編集

Bongoさん、回答いただき、ありがあとうございます。 前提条件については、上記のとおりです。 おかげさまで、クリックしたオブジェクトのみスプライトレンダラーを変更できました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問