unityでシーンにボタンを複数配置し、キーボードの方向キーとEnterキーで操作するGUIを作成しました。
さらに、この上に半透明のImageを画面いっぱいに配置し、ボタンへのマウスクリックイベントを無効にしました。
すると、マウスによるボタンへの操作自体はちゃんと無効にできているのですが、
クリックするとボタンに当たっていたフォーカスが無くなってしまって困っています。
クリックしてもフォーカスを無くさないスマートな方法ってあるのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答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
総合スコア10816
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。