2016-11-13 12 views
5

ズーム可能なスクロールビューのような、EditorWindow内の領域内にズーム効果を持たせたいのですが。GUI領域内の内容をパン/スケールする方法は?

だけパン効果と、次のスニペットのお得な情報が、それは私が(ズーム可能なエリアとクリッピング四角形内の内容はhSliderValue1(クリッピング)とhSliderValue2を通じて互いに独立して扱うことができない場合に抱えている問題を例示していますパンニング)。

using System; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEditor; 

public class ZoomTestWindow : EditorWindow 
{ 
    private static float kEditorWindowTabHeight = 20; 
    private static Matrix4x4 _prevGuiMatrix; 
    public static float hSliderValue1 = 0; 
    public static float hSliderValue2 = 0; 

    Rect[] wr = new Rect[]{ 
     new Rect(0, 0, 100, 100), 
     new Rect(50, 50, 100, 100), 
     new Rect(100, 100, 100, 100) 
    }; 

    [MenuItem("Window/Zoom Test #%w")] 
    private static void Init() 
    { 
     ZoomTestWindow window = EditorWindow.GetWindow<ZoomTestWindow>("Zoom Test", true, new System.Type[] { 
      typeof(UnityEditor.SceneView), 
      typeof(EditorWindow).Assembly.GetType("UnityEditor.SceneHierarchyWindow")}); 

     window.Show(); 
     EditorWindow.FocusWindowIfItsOpen<ZoomTestWindow>(); 
    } 

    public static Rect BeginZoomArea() 
    { 
     GUI.EndGroup(); //End the group that Unity began so we're not bound by the EditorWindow 

     GUI.BeginGroup(new Rect(hSliderValue1, 0, 200, 200)); 

     _prevGuiMatrix = GUI.matrix; 

     GUI.matrix = Matrix4x4.TRS(new Vector2(hSliderValue2, 0), Quaternion.identity, Vector3.one);; 

     return new Rect(); 
    } 

    public static void EndZoomArea() 
    { 
     GUI.matrix = _prevGuiMatrix; 
     GUI.EndGroup(); 
     GUI.BeginGroup(new Rect(0.0f, kEditorWindowTabHeight, Screen.width, Screen.height - (kEditorWindowTabHeight + 3))); 
    } 

    public void OnGUI() 
    { 
     BeginZoomArea(); 

     BeginWindows(); 
     wr[0] = GUI.Window(0, wr[0], DrawWindow, "hello"); 
     wr[1] = GUI.Window(1, wr[1], DrawWindow, "world"); 
     wr[2] = GUI.Window(2, wr[2], DrawWindow, "!"); 
     EndWindows(); 

     EndZoomArea(); 

     hSliderValue1 = GUI.HorizontalSlider(new Rect(200, 5, 100, 30), hSliderValue1, 0, 100); 
     hSliderValue2 = GUI.HorizontalSlider(new Rect(200, 25, 100, 30), hSliderValue2, 0, 100); 
    } 

    void DrawWindow(int id) 
    { 
     GUI.Button(new Rect(0, 30, 100, 50), "Wee!"); 
     GUI.DragWindow(); 
    } 
} 

enter image description here

多分スクロールビューを使用することにより、これを行う方法はありますか?

答えて

3

hSliderValue1で規制されているグループを新しいグループの中に埋め込む

using System; 
using System.Collections.Generic; 
using UnityEngine; 
using UnityEditor; 

public class ZoomMoveTestWindow: EditorWindow 
{ 
    private static float kEditorWindowTabHeight = 20; 
    private static Matrix4x4 _prevGuiMatrix; 
    public static float hSliderValue1 = 0; 
    public static float hSliderValue2 = 0; 

    Rect[] wr = new Rect[]{ 
     new Rect(0, 0, 100, 100), 
     new Rect(50, 50, 100, 100), 
     new Rect(100, 100, 100, 100) 
    }; 

    [MenuItem("Window/Zoom Test #%w")] 
    private static void Init() 
    { 
     ZoomMoveTestWindow window = EditorWindow.GetWindow<ZoomMoveTestWindow>("Zoom Test", true, new System.Type[] { 
      typeof(UnityEditor.SceneView), 
      typeof(EditorWindow).Assembly.GetType("UnityEditor.SceneHierarchyWindow")}); 

     window.Show(); 
     EditorWindow.FocusWindowIfItsOpen<ZoomMoveTestWindow>(); 
    } 

    public static Rect BeginZoomArea(Rect rect) 
    { 
     GUI.BeginGroup(rect); 

     GUI.BeginGroup(new Rect(hSliderValue1, 0, 200, 200)); 

     _prevGuiMatrix = GUI.matrix; 

     GUI.matrix = Matrix4x4.TRS(new Vector2(hSliderValue2, 0), Quaternion.identity, Vector3.one); 

     return new Rect(); 
    } 

    public static void EndZoomArea() 
    { 
     GUI.EndGroup(); 

     GUI.matrix = _prevGuiMatrix; 
     GUI.EndGroup(); 
     GUI.BeginGroup(new Rect(0.0f, kEditorWindowTabHeight, Screen.width, Screen.height - (kEditorWindowTabHeight + 3))); 
    } 

    public void OnGUI() 
    { 
     GUI.EndGroup(); //End the group that Unity began so we're not bound by the EditorWindow 

     BeginZoomArea(new Rect(10,10, 200, 200)); 

     BeginWindows(); 
     wr[0] = GUI.Window(0, wr[0], DrawWindow, "hello"); 
     wr[1] = GUI.Window(1, wr[1], DrawWindow, "world"); 
     wr[2] = GUI.Window(2, wr[2], DrawWindow, "!"); 
     EndWindows(); 

     EndZoomArea(); 

     hSliderValue1 = GUI.HorizontalSlider(new Rect(250, 5, 100, 30), hSliderValue1, 0, 100); 
     hSliderValue2 = GUI.HorizontalSlider(new Rect(250, 35, 100, 30), hSliderValue2, 0, 100); 
    } 

    void DrawWindow(int id) 
    { 
     GUI.Button(new Rect(0, 30, 100, 50), "Wee!"); 
     GUI.DragWindow(); 
    } 
} 

result

それは動作しますが、私は理由を知りません。 GUI.matrixBeginGroup(rect)の相互作用は不明であるためです。

PS:This postお手伝いがあります。

+0

残念なことに、ウインドウを「hello」に少し動かすと、左上隅にクリップが表示され、スライダーをどのように動かしてもクリップされ続けます。これは、GUI.matrixがクリッピング矩形にも適用されているためだと思います。これはGUI要素には意味がありますが、カスタムのパンまたはズームのエフェクトの余地はありません。 Martinのポストのコードには、GUI.matrixの代わりに各GUI要素の位置にデルタを追加するという回避策があります – rraallvv

関連する問題