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

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

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

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

Q&A

解決済

1回答

8007閲覧

クリックイベントを無効にしつつuGUIのフォーカスを無くさない方法

benzo

総合スコア35

Unity

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

0グッド

0クリップ

投稿2018/11/17 19:51

編集2018/11/18 09:17

unityでシーンにボタンを複数配置し、キーボードの方向キーとEnterキーで操作するGUIを作成しました。
さらに、この上に半透明のImageを画面いっぱいに配置し、ボタンへのマウスクリックイベントを無効にしました。

すると、マウスによるボタンへの操作自体はちゃんと無効にできているのですが、
クリックするとボタンに当たっていたフォーカスが無くなってしまって困っています。

クリックしてもフォーカスを無くさないスマートな方法ってあるのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

いまいちスマートじゃなくてすみませんが、currentSelectedGameObjectを監視して、フォーカスを許すオブジェクト以外が選択されたら元のオブジェクトを選択しなおすというのはどうでしょうか?

C#

1using System.Collections; 2using System.Linq; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6// 適当なオブジェクト...たとえばCanvasあたりにこのスクリプトをアタッチしておく 7public class SelectionRestrictor : MonoBehaviour 8{ 9 [HideInInspector] public GameObject previousSelection; // それまで選択されていたオブジェクト 10 public GameObject[] Selectables; // ここにインスペクタ上でフォーカス許可オブジェクトをセットしておく 11 12 private void Awake() 13 { 14 if (this.Selectables == null) 15 { 16 return; 17 } 18 19 // すべてのフォーカス許可オブジェクトにSelectionHookerをアタッチ 20 foreach (var selectable in this.Selectables) 21 { 22 var hooker = selectable.AddComponent<SelectionHooker>(); 23 hooker.restrictor = this; 24 } 25 26 // フォーカス制限用コルーチンをスタート 27 this.StartCoroutine(this.RestrictSelection()); 28 } 29 30 private IEnumerator RestrictSelection() 31 { 32 while (true) 33 { 34 // currentSelectedGameObjectを監視、選択が変更されたら... 35 yield return new WaitUntil( 36 () => (EventSystem.current != null) && (EventSystem.current.currentSelectedGameObject != this.previousSelection)); 37 38 // それまで選択されていたオブジェクトがnull、または許可リストに入っていれば何もしないが... 39 if ((this.previousSelection == null) || 40 this.Selectables.Contains(EventSystem.current.currentSelectedGameObject)) 41 { 42 continue; 43 } 44 45 // さもなくばそれまで選択されていたオブジェクトを再選択する 46 Debug.LogFormat( 47 "Reselect {0}.", 48 this.previousSelection.name); 49 EventSystem.current.SetSelectedGameObject(this.previousSelection); 50 } 51 } 52 53 private class SelectionHooker : MonoBehaviour, IDeselectHandler 54 { 55 public SelectionRestrictor restrictor; 56 57 // 選択解除時に、それまで選択されていたオブジェクトを覚えておく 58 public void OnDeselect(BaseEventData eventData) 59 { 60 this.restrictor.previousSelection = eventData.selectedObject; 61 Debug.LogFormat("Previous selection:{0}", this.restrictor.previousSelection.name); 62 } 63 } 64}

投稿2018/11/19 22:49

Bongo

総合スコア10807

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問