[cb]SceneView 获取鼠标位置
扩展需求
在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;
// }
//} //根据鼠标点击的位置实例化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
[cb]SceneView 获取鼠标位置的更多相关文章
- jq获取鼠标位置
jq获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- C++获取鼠标位置及全局检测鼠标行为
1.获取鼠标位置(在屏幕的位置) CPoint m_mouse; GetCursorPos(&m_mouse); 2. 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置 ...
- jquery 获取鼠标位置
//获取鼠标位置 $(function(){ $('body').mousemove(function(e) { e = e || window.event; __xx = e.pageX || e. ...
- Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现
Adobe Edge Animate –获取鼠标位置及跟随鼠标功能实现 版权声明: 本文版权属于 北京联友天下科技发展有限公司. 转载的时候请注明版权和原文地址. 在网络上浏览有关Edge相关问题的时 ...
- JavaScript获取鼠标位置的三种方法
在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的游览器下会有不同的结果甚至是有的游览器下没结果,这篇文章就鼠标点击位置坐标获取做一些简单的总结. 获取鼠 ...
- C# 图像处理:获取鼠标位置信息(全局)
Point ms = Control.MousePosition; //获取鼠标位置 this.label2.Text = string.Format("{0}:{1}", ms. ...
- 兼容IE FF 获取鼠标位置
由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事件才行.我这里有两段代码,思路都一 ...
- canvas获取鼠标位置
canvas获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- JS获取鼠标位置,兼容IE FF
由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事件才行.我这里有两段代码,思路都一 ...
随机推荐
- odoo开发笔记 -- 翻译机制及导入.po文件
待补充 http://ju.outofmemory.cn/entry/181972
- Python:渗透测试开源项目【源码值得精读】
sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网 ...
- bash回收站
通过替换rm命令使被删除的文件或文件夹被移动到-/.delete/日期文件夹,方便恢复 可以定期手动删除.delete文件夹或通过额外配置定期删除减少空间占用 # for rm {{ del_time ...
- 深度学习论文翻译解析(一):YOLOv3: An Incremental Improvement
论文标题: YOLOv3: An Incremental Improvement 论文作者: Joseph Redmon Ali Farhadi YOLO官网:YOLO: Real-Time Obje ...
- AD预测论文研读系列2
EARLY PREDICTION OF ALZHEIMER'S DISEASE DEMENTIA BASED ON BASELINE HIPPOCAMPAL MRI AND 1-YEAR FOLLOW ...
- 【ASP.NET MVC系列】浅谈Google Chrome浏览器(操作篇)(下)
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- InnoDB存储引擎--Innodb Buffer Pool(缓存池)
InnoDB存储引擎--Innodb Buffer Pool(缓存池) Innodb Buffer Pool的概念 InnoDB的Buffer Pool主要用于缓存用户表和索引数据的数据页面.它是一块 ...
- .15-浅析webpack源码之WebpackOptionsApply模块-plugin事件流总览
总体过了一下后面的流程,发现Compiler模块确实不适合单独讲解,这里继续讲解后面的代码: compiler.options = new WebpackOptionsApply().process( ...
- 启动设置mongodb
启动 ①:启动之前,我们要给mongodb指定一个文件夹,这里取名为”db",用来存放mongodb的数据. ②:微软徽标+R,输入cmd,首先找到“mongodb”的路径,然后运行mong ...
- javascript如何处理很多数据,类似分页切换
需求:一个用户列表数据,如果对应列表数据大于10个,就每10个保存到二维数组,后面不足10个的依然放在二维数组尾部 用处:模拟分页,或者局部刷新 在线DEMO:戳这里 var obj=[ { &quo ...