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

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

ただいまの
回答率

87.49%

【Unity】オブジェクトドラッグとコンテキストメニュー表示選択のマウス重なり(追記)

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,071

score 16

ご相談内容

AssetStoreで購入した『Dynamic Right Click Menu』でメニューを選択する際、裏側に隠れているオブジェクトを左クリック選択してしまい、すでに用意してあるオブジェクトドラッグが起きてずれてしまう問題が生じています。
購入したAssetの中身を見る限り、ContextMenuを使っているみたいですが、このコンテキストメニューが表示されてなおかつ、選択中のときに、オブジェクトドラッグのスクリプトを無効にしたいと考えております。

追記内容

SelectorというGameObjectを左クリックで、選択したときに裏側に隠れているオブジェクトを選択してしまうみたいです。このSelectorはメニュー表示のなかの青網掛け部分に相当します。

↓右クリックメニュー
イメージ説明

↓オブジェクトに重なった位置で、右クリックメニューを表示させメニュー選択したときに、裏側のオブジェクトが押されてしまう。
![イメージ説明](304ae0fbc4c40e87b7d3bd7cf68aab9c.jpeg)メージ説明](21a7cfec489003e7d201bee87411b27e.jpeg)説明](c8a4f1027f9fdc7700d45d81b5bd25b1.jpeg)ージ説明](aa3ea436097bf4c01cf0e18546a033a3.jpeg)8d665cbbc413c4ad791369a4fed91ef.jpeg)

この購入Assetの構成が複雑で、理解できてないことが多く、うまく相談できていないかもしれませんが、コンテキストメニューでのマウス左クリックかぶりの解消方法などの一般的なテクニックなどご教示いただけると幸いです。
(”コンテキストメニューが非表示の時”の条件文や別スクリプトからコンテキストメニュー状態を拾う方法など)

右クリックメニューのコード

予めPrefabで用意されたContextMenuを呼び出しているみたいです。

public class ExampleMenu : MonoBehaviour
{
    public ContextMenu prefab;
    ContextMenu mainMenu;
    void Start()
    { mainMenu = Instantiate<GameObject>(prefab.gameObject).GetComponent<ContextMenu>();//create a new object
        mainMenu.transform.SetParent(transform);
        mainMenu.transform.localScale = Vector3.one;
        mainMenu.transform.localPosition = Vector3.zero;

        mainMenu.AddMenuItem("Clear", Clear);//show this item opens a sub menu
     }
 void Update()
    {
        if(Input.GetMouseButtonDown(1))//if right clicking
        {
            ContextMenu.HideAllMenus();//hide other menus
            mainMenu.ShowAtMousePosition();//show the menu
        }
    } 
    void Clear()
    {
        Debug.Log("Cleared");
    }
ContextMenuのプレファブ構成

イメージ説明

オブジェクトドラッグ コード

オブジェクトにコライダーを用意して移動。

      {
        Vector3 objectPointInScreen
            = Camera.main.WorldToScreenPoint(this.transform.position);

        Vector3 mousePointInScreen
            = new Vector3(Input.mousePosition.x,
                          Input.mousePosition.y,
                          objectPointInScreen.z);

        Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint(mousePointInScreen);
        mousePointInWorld.z = this.transform.position.z;
        this.transform.position = mousePointInWorld;
      }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

右クリックでメニューを開いたタイミングにフラグを追加し、オブジェクト選択の方でメニュー開のフラグが立っている際は処理が通らないようにしてはどうでしょうか?

以下追記 06/08
ひとまずmainMenu.csに対して以下を追記。内容としては先述したメニューを開いているかどうかのフラグを追加、メニュー開時にフラグをTrueにする処理を追記します。

public class mainMenu : MonoBehaviour
{
    public bool CheckMenuStatus;
    void Start()
    { 
        CheckMenuStatus = false;
    }
 void ShowAtMousePosition()
    {
        CheckMenuStatus = true;
    } 
}

あと、恐らく同じmainMenu.cs内にメニューを閉じる処理があると思うので、そちらのメソッド内にCheckMenuStatus = false;と追記してください。これでメニューが開いたときはTrue、開いていない時はFalseの状態となります。

この上でオブジェクトドラッグのスクリプト内に「CheckMenuStatusがTrueでない時のみオブジェクト操作可能」とします。なので、

 public mainMenu MenuCS; //mainMenu.csを取得するための変数

     if(MenuCS.CheckMenuStatus != true)//CheckMenuStatusがTrueでない時のみ以下の処理を実行する
     {
        Vector3 objectPointInScreen
            = Camera.main.WorldToScreenPoint(this.transform.position);

        Vector3 mousePointInScreen
            = new Vector3(Input.mousePosition.x,
                          Input.mousePosition.y,
                          objectPointInScreen.z);

        Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint(mousePointInScreen);
        mousePointInWorld.z = this.transform.position.z;
        this.transform.position = mousePointInWorld;
      }


とすれば恐らくメニューが開いている時にオブジェクトとメニューが重なっていても、オブジェクトは選択できないようになっているはずです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/08 09:57

    大変恐れ入りますが、サンプルでコードを記載していただいてもよろしいでしょうか。
    知識不足で申し訳ございません。

    キャンセル

  • 2020/06/08 10:26

    サンプル出すにはmainMenu.ShowAtMousePosition();の中にフラグの条件を書かないと上手くいかなさそうなので、現状では無理です...。
    書き方と挿入箇所について詳細に書いておきます。

    キャンセル

  • 2020/06/08 12:13

    解説ありがとうございます。
    自分の勘違いがあってもう一工夫必要そうですが、ご教示いただいた方法の応用でうまくできそうです。
    ご協力いただきありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る