2017-05-13 1 views
0

私はユニティでカスタムノードエディタウィンドウを構築しています。this oneなど、さまざまなリソースを調べています。GUI.Boxを使用してノードウィンドウを構築しています。GUIコントロールを持つUnity3Dドラッグ可能なGUI.Box

これらのウィンドウを好きなようにドラッグすることができますが、コントロールをGUI.Boxに追加すると、私が書いたDrag()機能をオーバーライドしてもらいたいです。

問題の例 - 垂直スライダーを上に動かすと、ボックス全体がドラッグされます。

Vertical Slider issues

GUI.Boxを使用して、この動作を修正する方法はありますか、私はGUI.Windowに戻る必要があり、その内蔵のGUI.DragWindow()

ここで私が使用しているコードの簡易版です。

EditorMouseInput.cs:

private bool ActionLeftMouseDown() 
{ 
    mouseDownNode = editor.GetSelectedNode(Input.current.mousePosition); 

    if (mouseDownNode == null) 
     editor.StartMovingEditorCanvas(); 
    else 
     mouseDownNode.IsSelected = true; 
} 

BaseNodeEditor.cs:

public BaseNode GetSelectedNode(Vector2 mousePos) 
{ 
    foreach (BaseNode node in Nodes) 
    { 
     if (node.WindowRect.Contains(mousePos)) 
      return node; 
    } 
    return null; 
} 

public void Drag(Vector2 delta) 
{ 
    if (!MoveEditorMode && !ConnectionMode) 
    { 
     foreach (BaseNode node in Nodes) 
     { 
      node.Drag(delta); 
     } 
    } 

BaseNode.csは、 :

派生したJu​​mpNodeクラスに垂直スライダが追加されました。スライダーを構築するヘルパークラスのエキス:

Vector2 pos = node.WindowRect.position + rect.position * GridSpacing; 
value = GUI.VerticalSlider(new Rect(pos, rect.size * GridSpacing), value, maxValue, minValue); 

これは私がやりたいしない理由を私は見ることができますが、私はそれがGUIコントロールを与えて行くの一部ではないのか分かりませんGUI.Box。

助けや提案、さらに別の情報源への微調整も大変ありがとうございます。私は頭の中にあるすべての検索語を使っていると感じています。

編集:解決済み:私のためにこの問題を解決してくれたKleberに感謝します。他の誰かがこのような問題に遭遇した場合、私の解決策はGUIコントロールが左マウスイベントを自動的に消費することを認識していたので、スライダをクリックすると、

私がする必要があったのは、NodeクラスのIsSelectedフラグとIsDraggedフラグを分離し、mouseUpでIsDraggedをクリアすることでした。私はもともと、IsSelectedを使用して、ドラッグを有効にして選択したフラグを設定しました(複数のノードを選択して一度にドラッグできました)。

答えて

1

かなり複雑なチュートリアルなので、私はそれを完全には読まなかったが、問題はMouseDrag検出であるようだ。まあ、基本的には、ボックス内のGUI要素をクリックしたときに、イベントの伝播を止めたいのですが、そうですか?これを行うには、

Event.current.Use() 

ユーザーがコンポーネントのいずれかにマウスをドラッグするたびに呼び出します。あなたが言及したリソースを使用して

は、私がNodeクラスを変更し、このように終わる、Draw()メソッド内のスライダーを追加しました:

public void Draw() { 
    inPoint.Draw(); 
    outPoint.Draw(); 
    GUI.Box(rect, title, style); 
    GUI.BeginGroup(rect); 
    _value = GUI.HorizontalSlider(new Rect(20, 0, 50, 20), _value, 100, -100); 
    GUI.EndGroup(); 
} 

First example

あなたがすることができるもう一つは、どのように変化していますあなたは窓を引く。ここでは、私は、最新Unityバージョン(5.6)上でテストしてみた簡単な例です:

private void OnGUI() { 
    GUI.Box(_rect, string.Empty); 
    GUI.BeginGroup(_rect); 

    _value = GUI.VerticalSlider(new Rect(145, 100, 20, 100), _value, 100, -100); 
    GUI.EndGroup(); 

    var e = Event.current; 
    if (e.type == EventType.MouseDrag && _rect.Contains(e.mousePosition)) { 
     _rect.x += e.delta.x; 
     _rect.y += e.delta.y; 
     Repaint(); 
    } 
} 

あなたが見ることができるように、この例が正しく動作するEvent.current.Use()を必要としません。

Second example

+0

回答ありがとうございます!私の問題はスライダーコントロール(または任意のコントロール)がボックス内に存在しないことにありますが、Event.current.Use()は間違いなく動作します。また、GUIコントロールを組み込んでいるので、クリック、選択、ドラッグなどのイベントは表示されません。 – Aspekt

+1

'Event.current'は' OnGUI() '内でのみアクセス可能です。IMGUIシステム専用です。送信したリソースには、例えば 'ProcessEvents()'メソッドのパラメータとして送られた 'Event.current'の使用があります。私は私の答えを編集して、うまくいく他のソリューションを追加しました。 – Kleber

+1

まず、私はちょうどこれにあなたの時間を取るために大きな感謝をしたいと思います。私は問題を理解しました - それは思考の少し変化をもたらし、あなたは私がそこに着くのを間違いなく助けました。 MouseupHandlerスクリプトを1つ用意していましたが、複数のボックスを選択できるようにするためにmouseupの選択をクリアしませんでした。コントロールがイベントを自動的に消費することはわからなかったので、間違った場所を探していました。ボックスをドラッグすると、スライダをドラッグしたときに選択されていた状態が維持されました。 – Aspekt

関連する問題