扩展需求

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

Demo

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

重点部分

实现代码

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;//    }//}//根据鼠标点击的位置实例化Prefabif (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向量保存射线的来源//找到PrefabObject 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向量保存射线的来源//找到PrefabObject 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向量保存射线的来源//找到PrefabObject 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

转载于:https://www.cnblogs.com/zhaoqingqing/p/3801342.html

[cb]SceneView 获取鼠标位置相关推荐

  1. JS获取鼠标位置,兼容IE FF

    JS获取鼠标位置,兼容IE FF 由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事 ...

  2. Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现

    Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在网络上浏览有关Edge相关问题的时 ...

  3. C++获取鼠标位置,移动鼠标

    获取鼠标位置: 函数原型: WINUSERAPI BOOL WINAPI GetCursorPos(__out LPPOINT lpPoint);WINUSERAPI BOOL WINAPI GetP ...

  4. Python获取鼠标位置,虚拟键盘操作

    Python获取鼠标位置,虚拟键盘操作 PS: 也是从网上各个帖子中学习的Python,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 代码转载:https://blog.csdn ...

  5. Panda3D 获取鼠标位置、Panda3D任务管理器

    看一下Panda3D Bump-Mapping示例: 运行起来是一个鼠标控制模型的例子: 它的Bump-Mapping是模型表面两种不同的效果:先不管: 它的房子模型单独用pview看一下如下: 先看 ...

  6. powershell 获取鼠标位置 与 鼠标点击

    文章目录 获取鼠标位置 鼠标一段事件未移动,点击右键 获取鼠标位置 [void][reflection.assembly]::Load('System.Windows.Forms, Version=2 ...

  7. 获取鼠标位置和手机触摸点位置

    思路 获取鼠标位置和手机触摸位置的思路都是相同的: 1.是否可以获取到pageX和pageY,有直接取值 2.没有,获取clientX和clientY,这个值在不翻页的情况下是正确位置,如果翻页了还需 ...

  8. h5+js 移动端监听点击、移动、松开,获取鼠标位置

    //点击 document.addEventListener('touchstart', function(){}); //移动 document.addEventListener('touchmov ...

  9. Qt获取鼠标位置(绝对位置、相对位置)

    在进行界面编程时,经常需要获取鼠标的位置,特别是需要知道鼠标在界面上某个控件的相对位置.在Qt其实获取这几种位置还是比较简单的.首先我们需要了解Qt的坐标系统,Qt的坐标系统是有QPainter类控制 ...

最新文章

  1. 图灵2010.12书讯
  2. sse php,sse.php · Gitee 极速下载/modphp - Gitee.com
  3. 使用Pocsuite3
  4. quart动态执行定时任务
  5. 带你理清 Java 混乱的日志体系 - log4j、logback、log4j2、jcl、SLFJ 究竟是啥关系?
  6. xslt三种带图片的超链接(a标签,img标签)写法
  7. java开发工具软件排行榜
  8. Java 文件重命名
  9. 水星无线网dns服务器是什么,水星路由dns设置教程,-1
  10. 不玩了?王思聪退出香蕉娱乐董事长职务,麻闻多接任
  11. php代码审计zhuru,[php 代码审计]Espcms 暴力注入
  12. mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题
  13. 富文本编辑器Editor.md入门
  14. matlab锁相放大器,锁相放大器原理和模块实现与仿真.DOC
  15. 计算机查看图片的打开方式,win10如何设置打开图片方式为照片查看器-img文件怎么打开...
  16. 猴子吃桃问题的函数递归解决方案
  17. D2 日报 2019年3月20日
  18. c51语言如何按位异或,51单片机教程:单片机逻辑与或异或指令详解
  19. java 定时凌晨_java Timer 定时每天凌晨1点执行任务
  20. karabiner-elements Mac下实现按键全定制 capslox完美替代品

热门文章

  1. Java导出源程序_JAVA导出项目的所有源代码到一个文件
  2. php5.3.3php5.4如何支持zend,php5.3不支持ZendOptimizer的解决办法(Zend Guard Loader)
  3. Spring mvc 请求体处理 @RequestBody
  4. flask-sqlalchemy Models
  5. Java Spring AspectJ
  6. Linux 磁盘命令
  7. python抛硬币代码_求助python掷硬币
  8. 求矩形的最小值c语言,C语言复习---矩形法求定积分函数
  9. 来自百度的71款开源项目
  10. Mysql学习总结(26)——MySQL子查询