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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

1回答

1390閲覧

ボタンを左クリックできるが、右クリックできないので右クリックできるようにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/05/28 12:17

編集2022/05/30 12:16

イメージ説明### 1:発生している問題・エラーメッセージ
unityで3dのゲーム開発をしているのですが、ボタンを左クリックすると、正常に処理がなされるのですが、右クリックをしても何の反応もありません。

2:自分で調べたことや試したこと

クリックの判定はButtonコンポネントにアタッチしてあるonClickから行っております。
InputManagerのSubmitのpositiveButtonの欄に"mouse 1"と入力し、Standalone Input Moduleで正しく、"Submit"と入力されているかどうか確認しましたが、何の反応もありませんでした。また、このSubmitのpositiveButtonの欄に"space"や"right", "mouse 0"などを入力すると正しく処理されました。一方で、"mouse 1", "mouse 2"は何の反応もありませんでした。どなたかにご助力願いたいと思っております。情報不足でしたら、遠慮なく質問してくださるとありがたいです。よろしくお願いいたします。

3:使っているツールのバージョンなど補足情報

unityのバージョン:2020.3.22f1

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/05/29 09:25

教えていただいたURLの通りにカーソル操作で右クリックを押すと処理がなされました。ただ、自分はマウスホイールでボタンを選択できるようにしているために、あるボタンが選択されているときに、右クリックを押すと処理がなされるようにしたいと思っています。 onClickで呼び出すのをやめて、ISubmitHandlerインターフェースとonSubmitメソッドを記述してみたり、ボタンにEventtriggerをアタッチして、Submitメソッドで右クリックできるか試してみましたが、今のところうまくいきません。相変わらず、InputManagerでspace,rightなどを入力するとうまくいきますが、mouse0, mouse1, mouse2などではうまくいきませんでした。続けて解決策を模索します。
Y0241-N

2022/05/30 01:15

> ただ、自分はマウスホイールでボタンを選択できるようにしているために、あるボタンが選択されているときに、右クリックを押すと処理がなされるようにしたいと思っています。 単に右クリックでボタンが押せるようにしたいだけではない感じですか? 最終的にどういう挙動を目指しているのでしょうか?
退会済みユーザー

退会済みユーザー

2022/05/30 12:13

ボタンを右クリックをしたときに関数を呼び出したいと思っております。例えば、HPを回復する関数を呼び出すとか。今自分が作っているゲームはゲームが始まったらすぐEventSystem.current.SetSelectedGameObject(button)でボタンにフォーカスを当て、マウスカーソルを非表示にするようにしてあります(escでマウスカーソルを表示するようにはできる)。ボタンの選択はマウスホイールで選択できるようにしてあり、その状態で、右クリックを押して、関数を呼び出したいと思っていますが、現状できていない状況です。ちなみにinputManagerのsubmitのpositivebuttonを"space"に変え、Eventtrigerのsubmitをアタッチ、ゲームを開始し、ボタンを選択、spaceを押してみると関数を呼び出すことに成功しました。
退会済みユーザー

退会済みユーザー

2022/05/30 12:19

画像を載せさせていただきました。画面上にいくつかのボタンがあるのがお分かりいただけると思うのですが、その中でも一番左側がゲームが始まったと同時に最初にフォーカスするボタンになります。マウスホイールすると隣のボタンを選択できます。この状態で右クリック、関数を呼び出したいと思っております。
guest

回答1

0

ベストアンサー

cs

1using System.Collections; 2using System.Linq; // 追加 3using UnityEngine; 4using UnityEngine.EventSystems; // 追加 5using UnityEngine.UI; // 追加 6 7public class Right_click_andPress_theFocusButton : MonoBehaviour 8{ 9 public Button FocusButton; //消してよい 10 11 /// <summary> 12 /// <see cref="Selectable"/> をフックするクラスです。 13 /// </summary> 14 private class SelectionHooker : MonoBehaviour, IDeselectHandler 15 { 16 /// <summary>親コンポーネント。</summary> 17 public Right_click_andPress_theFocusButton Restrictor; 18 19 /// <summary> 20 /// 選択解除時にそれまで選択されていたオブジェクトを覚えておく。 21 /// </summary> 22 /// <param name="eventData"></param> 23 public void OnDeselect(BaseEventData eventData) 24 { 25 Restrictor.PreviousSelection = eventData.selectedObject; 26 } 27 } 28 29 /// <summary>直前まで選択されていたオブジェクト。</summary> 30 private GameObject PreviousSelection = null; 31 32 /// <summary> 33 /// 選択対象のオブジェクト一覧。 34 /// </summary> 35 private GameObject[] _selectables; 36 37 private void Awake() 38 { 39 EventSystem.current.SetSelectedGameObject(FocusButton.gameObject); //消してよい 40 // すべての Selectable を取得する 41 var selectableList = (FindObjectsOfType(typeof(Selectable)) as Selectable[]).ToList(); 42 43 _selectables = selectableList.Select(x => x.gameObject).ToArray(); 44 45 // フォーカス許可オブジェクトに SelectionHooker をアタッチ 46 foreach (var selectable in this._selectables) 47 { 48 var hooker = selectable.AddComponent<SelectionHooker>(); 49 hooker.Restrictor = this; 50 } 51 52 // フォーカス制御用コルーチンをスタート 53 StartCoroutine(RestrictSelection()); 54 } 55 56 /// <summary> 57 /// フォーカス制御処理。 58 /// </summary> 59 private IEnumerator RestrictSelection() 60 { 61 while (true) 62 { 63 // 別オブジェクトを選択するまで待機 64 yield return new WaitUntil( 65 () => (EventSystem.current != null) && (EventSystem.current.currentSelectedGameObject != PreviousSelection)); 66 67 // まだオブジェクトを未選択、または許可リストを選択しているなら何もしない 68 if ((PreviousSelection == null) || _selectables.Contains(EventSystem.current.currentSelectedGameObject)) 69 { 70 continue; 71 } 72 73 // 選択しているものがなくなった、または許可していない Selectable を選択した場合は前の選択に戻す 74 EventSystem.current.SetSelectedGameObject(PreviousSelection); 75 Debug.Log("ReSelect"); 76 77 if(Input.GetMouseButtonDown(1)) 78 { 79 try 80 { 81 Button selectedButton = PreviousSelection.GetComponent<Button>(); 82 selectedButton.onClick.Invoke(); 83 } 84 catch 85 { 86 Debug.Log("null"); 87 } 88 } 89 } 90 } 91 92 public void TestAction() //消してよい 93 { 94 Debug.Log("click"); 95 } 96}

だいたいこんな感じです、ネックなのはフォーカスされているボタン以外の場所で右クリックすると、フォーカスが外れてしまうので、フォーカスが外れる前に選択されていたオブジェクトを再フォーカスし、ボタンならOnClickイベントを呼び出すようにしています。
常に何らかがフォーカスされ続けている状態になるので、フォーカスを外したい場合はbool関数を追加して制御するなり、このスクリプト自体を別のスクリプトで非アクティブ化するなりする必要があります。

投稿2022/05/31 05:08

Y0241-N

総合スコア1066

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

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

退会済みユーザー

退会済みユーザー

2022/05/31 13:39

ありがとうございます。色々と自分なりにアレンジさせていただこうと思います。もしまた、疑問点などがあったら質問させていただきます。
Y0241-N

2022/05/31 23:53

回答に満足していただけましたらベストアンサーを選択してこの質問をクローズしていただくようお願い致します。 もし疑問点等ありましたらクローズ後でも分かる範囲で回答しますので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問