【unity】SceneView场景工具小记

作者: 黒可乐 | 来源:发表于2017-03-07 15:16 被阅读476次

最近在跟师兄做寻路编辑插件,发现SceneView这个是一个很不错的东西,但是官方文档里居然没有这个类的说明,难道是搜索姿势不正确,还是说有新的东西把这个代替了。

是什么?

就是视图scene窗口的编辑类。它是继承于SearchableEditorWindow, IHasCustomMenu这两个东西的。

SceneViewCallout
小用法

也没有把这个研究透彻,就说说我用到这个里面的几个小接口吧。

切换2d视角

我们都知道scene里面有一个按键是2d,点击它就可以转换到2d视角。


Scene Gizmo

也可以通过Scene Gizmo点击或者右键选择来控制场景摄像机的角度与投射。
这个是把你的scene角度调为2d视角:

sceneView = SceneView.lastActiveSceneView;
sceneView.in2DMode = true;

SceneView.lastActiveSceneView按我的理解应该就是上一次渲染出来的scene场景。
当然咱们如果已经是2d视角,再点一次就回到我们之前的视角,这个的实现:

    private bool lastProjection;
    private Quaternion lastQuaternion;

    private void Change2dView(bool state)
    {
        var sceneView = SceneView.lastActiveSceneView;
        if (state)
        {
            lastProjection = sceneView.orthographic;
            lastQuaternion = sceneView.rotation;
        }
        else
        {
            sceneView.LookAt(sceneView.pivot, lastQuaternion, sceneView.size, lastProjection);
        }
        sceneView.in2DMode = state;
    }

当然系统的切换到2d的按钮,还设置了自动切换工具。


工具
 Tools.current = Tool.None;
 Tools.viewTool = ViewTool.None;

这样即可。

切换自定义视角

官方接口就只给出了转向2d的角度,但是我们看右键点击却有这么多,然后辗转查询,下面这些切换都是在SceneViewRotation这个类中编写的。具体的就不废话了。


右键点击

细心的读者肯定都知道这个怎么做了,就是使用这一句代码就好了:

  sceneView.LookAt(sceneView.pivot, lastQuaternion, sceneView.size, lastProjection);

只用需要更改rotation与peojection即可。

OnSceneGUI事件

这个有点像OnGUI的一个事件方法,传入的就是一个场景视图。

 SceneView.onSceneGUIDelegate += OnSecneGUI;

方法中可以

private void OnSecneGUI(SceneView sceneView){
    var current = Event.current;
    switch (current.type)
    {
        case EventType.KeyUp:
            //键盘按键检测
            break;
        case EventType.MouseUp:
            //鼠标弹起,这里是鼠标所有的点击,如果要在区别如下
                if (current.button == 0)
                {
                    DrawPoint();
                }
            break;
        case EventType.MouseDown:
            //鼠标按下
            break;
        case EventType.MouseDrag:
             //鼠标拖
            break;
         case EventType.Repaint:
           //重绘
            break;
        case EventType.Layout:
            //布局
            break;
    }
  }

详细的事件类型可以看这里

禁止鼠标点击

只需要在EventType.Layout这个选项中添加:

HandleUtility.AddDefaultControl(GUIUtility.GetControlID(FocusType.Passive));

当然就是忽略点击。

嗯,暂时就这么多吧。谢谢了。

相关文章

网友评论

    本文标题:【unity】SceneView场景工具小记

    本文链接:https://www.haomeiwen.com/subject/euqfvttx.html