zoukankan      html  css  js  c++  java
  • [cb]SceneView 获取鼠标位置

    扩展需求

    在Scene视图中获取鼠标的位置

    Demo

    在Scene视图中,当鼠标点击时实例化一个Cube

    image

    重点部分

    image image

    image

    image

    实现代码

    using UnityEngine;
    using UnityEditor;
    
    [CustomEditor(typeof(MyGrid))]
    public class MyGridInspector : Editor
    {
        MyGrid grid;
        public void OnEnable()
        {
            grid = (MyGrid)target;//初始化时获取引用
            SceneView.onSceneGUIDelegate += GridUpdate;//获取SceneView的输入
        }
    
        public void OnDisable()
        {
            // SceneView.onSceneGUIDelegate -= GridUpdate;
        }
    
        public override void OnInspectorGUI()
        {
    
    
            GUILayout.BeginHorizontal();
            GUILayout.Label("网格宽度");
            grid.width = EditorGUILayout.FloatField(grid.width, GUILayout.Width(50));
            GUILayout.EndHorizontal();
    
            GUILayout.BeginHorizontal();
            GUILayout.Label("网格高度");
            grid.height = EditorGUILayout.FloatField(grid.height, GUILayout.Width(50));
            GUILayout.EndHorizontal();
    
            if (GUILayout.Button("打开Grid Window", GUILayout.Width(255)))
            {
                MyGridWindow window = (MyGridWindow)EditorWindow.GetWindow(typeof(MyGridWindow));
                window.Init();
            }
    
            SceneView.RepaintAll();//SceneView重绘
        }
    
        void GridUpdate(SceneView sceneview)
        {
            Event e = Event.current;//获取事件
    
            if (e.isKey && e.character == 'a')
            {
                //GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
                GameObject obj;
    
                //如果选中Object
                //if (Selection.activeObject)
                //{
                //    obj = (GameObject)Instantiate(Selection.activeObject);
                //    obj.transform.position = Vector3.zero;
                //}
    
                //在Editor模式实例化一个Prefab
                //if (Selection.activeObject)
                //{
                //    //找到Prefab
                //    Object prefab =  PrefabUtility.GetPrefabParent(Selection.activeObject);
                //    if (prefab)
                //    {
                //        obj = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                //        obj.transform.position = Vector3.zero;
                //    }
                //}
    
    
                //根据鼠标点击的位置实例化Prefab
                if (Selection.activeObject)
                {
                    //屏幕的鼠标坐标转换成世界坐标
                    /**
                     * 1、从屏幕发出射线
                     * 2、我们需要转化事件的屏幕空间的空间是可以接受的screenpointtoray()
                     * 3、e.mousePosition 左上角坐标(0,0),右下角坐标(Camera.current.pixelWidth, -Camera.current.pixelHeight),
                          把它转换成世界坐标变为左下角(0,9),右上角(Camera.current.pixelWidth, Camera.current.pixelHeight)
                     */
                    /* 
                     Ray r = Camera.current.ScreenPointToRay(new Vector3(e.mousePosition.x, -e.mousePosition.y + Camera.current.pixelHeight));
                     Vector3 mousePos = r.origin;//mousepos向量保存射线的来源
                     //找到Prefab
                     Object prefab = PrefabUtility.GetPrefabParent(Selection.activeObject);
                     if (prefab)
                     {
                         obj = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                         obj.transform.position = new Vector3(mousePos.x,mousePos.y,0.0f);
                     }*/
                }
    
                //将Cube对齐到网格中心位置?
                if (Selection.activeObject)
                {
                    Ray r = Camera.current.ScreenPointToRay(new Vector3(e.mousePosition.x, -e.mousePosition.y + Camera.current.pixelHeight));
                    Vector3 mousePos = r.origin;//mousepos向量保存射线的来源
                    //找到Prefab
                    Object prefab = PrefabUtility.GetPrefabParent(Selection.activeObject);
                    if (prefab)
                    {
                        obj = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                        Vector3 aligned = new Vector3(Mathf.Floor(mousePos.x / grid.width) * grid.width + grid.width / 2.0f,
                            Mathf.Floor(mousePos.y / grid.height) * grid.height + grid.height / 2.0f,
                            0.0f);
    
                        obj.transform.position = aligned;
                    }
                }
            }
            else if (e.isKey && e.character == 'n' && e.clickCount==0) //在当前鼠标位置创建一个Cube
            {
                Ray r = Camera.current.ScreenPointToRay(new Vector3(e.mousePosition.x, -e.mousePosition.y + Camera.current.pixelHeight));
                Vector3 mousePos = r.origin;//mousepos向量保存射线的来源
    
                GameObject obj = GameObject.CreatePrimitive(PrimitiveType.Cube);
                Vector3 aligned = new Vector3(Mathf.Floor(mousePos.x / grid.width) * grid.width + grid.width / 2.0f,
                    Mathf.Floor(mousePos.y / grid.height) * grid.height + grid.height / 2.0f,
                    0.0f);
    
                obj.transform.position = aligned;
                //注册撤消操作
                Undo.RegisterCreatedObjectUndo(obj, "Create" + obj.name);
                Debug.Log("create");
    
            }
            else if (e.isKey && e.character == 'd')//删除选中的GameObject
            {
                foreach (GameObject obj in Selection.gameObjects)
                {
                    Debug.Log(obj.name);
                    DestroyImmediate(obj);
                }
            }
            else if (e.isKey && e.character == '1')
            {
                GameObject obj;
                if (Selection.activeObject)
                {
                    Ray r = Camera.current.ScreenPointToRay(new Vector3(e.mousePosition.x, -e.mousePosition.y + Camera.current.pixelHeight));
                    Vector3 mousePos = r.origin;//mousepos向量保存射线的来源
                    //找到Prefab
                    Object prefab = PrefabUtility.GetPrefabParent(Selection.activeObject);
                    if (prefab)
                    {
                        obj = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                        Vector3 aligned = new Vector3(Mathf.Floor(mousePos.x / grid.width) * grid.width + grid.width / 2.0f,
                            Mathf.Floor(mousePos.y / grid.height) * grid.height + grid.height / 2.0f,
                            0.0f);
    
                        obj.transform.position = aligned;
                        //注册撤消操作
                        Undo.RegisterCreatedObjectUndo(obj, "Create" + obj.name);
                        Debug.Log("create");
                    }
                }
            }
            //撤消单个对象实例
            else if (e.isKey && e.character == '4')
            {
                GameObject obj;
                if (Selection.activeObject)
                {
                    Ray r = Camera.current.ScreenPointToRay(new Vector3(e.mousePosition.x, -e.mousePosition.y + Camera.current.pixelHeight));
                    Vector3 mousePos = r.origin;//mousepos向量保存射线的来源
                    //找到Prefab
                    Object prefab = PrefabUtility.GetPrefabParent(Selection.activeObject);
                    if (prefab)
                    {
                        Undo.IncrementCurrentGroup();
                        obj = (GameObject)PrefabUtility.InstantiatePrefab(prefab);
                        Vector3 aligned = new Vector3(Mathf.Floor(mousePos.x / grid.width) * grid.width + grid.width / 2.0f,
                            Mathf.Floor(mousePos.y / grid.height) * grid.height + grid.height / 2.0f,
                            0.0f);
    
                        obj.transform.position = aligned;
                        //注册撤消操作
                        Undo.RegisterCreatedObjectUndo(obj, "Create" + obj.name);
                        Debug.Log("create");
                    }
                }
            }
        }
    }

    参考资料

    http://code.tutsplus.com/tutorials/how-to-add-your-own-tools-to-unitys-editor--active-10047

  • 相关阅读:
    2/4 关于 Vue.js 中 this.$nextTick 的个人简单解释
    2/3 初次搭建 Vue 项目遇到的问题汇总
    前端中常见的布局
    如何判断一个变量是否为数组(isArray)
    ubuntu下安装截图工具
    正向代理、反向代理
    javascript中的基本数据类型
    css3 中的渐变
    javascript中的toString()
    ubuntu下面安装nodejs
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/3801342.html
Copyright © 2011-2022 走看看