扩展需求

在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 获取鼠标位置的更多相关文章

  1. jq获取鼠标位置

    jq获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. C++获取鼠标位置及全局检测鼠标行为

    1.获取鼠标位置(在屏幕的位置)  CPoint m_mouse; GetCursorPos(&m_mouse); 2. 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置 ...

  3. jquery 获取鼠标位置

    //获取鼠标位置 $(function(){ $('body').mousemove(function(e) { e = e || window.event; __xx = e.pageX || e. ...

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

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

  5. JavaScript获取鼠标位置的三种方法

    在一些DOM操作中我们经常会跟元素的位置打交道,鼠标交互式一个经常用到的方面,令人失望的是不同的游览器下会有不同的结果甚至是有的游览器下没结果,这篇文章就鼠标点击位置坐标获取做一些简单的总结. 获取鼠 ...

  6. C# 图像处理:获取鼠标位置信息(全局)

    Point ms = Control.MousePosition; //获取鼠标位置 this.label2.Text = string.Format("{0}:{1}", ms. ...

  7. 兼容IE FF 获取鼠标位置

    由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事件才行.我这里有两段代码,思路都一 ...

  8. canvas获取鼠标位置

    canvas获取鼠标位置 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

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

    由于Firefox和IE等浏览器之间对js解释的方式不一样,firefox下面获取鼠标位置不能够直接使用clientX来获取.网上说的一般都是触发mousemove事件才行.我这里有两段代码,思路都一 ...

随机推荐

  1. IdentityServer4之SSO(基于OAuth2.0、OIDC)单点登录、登出

    IdentityServer4之SSO(基于OAuth2.0.OIDC)单点登录.登出 准备  五个Web站点: 1.localhost:5000 :                  认证服务器.2 ...

  2. Java-jacob-文件转HTML

    Java-jacob-文件转HTML: 下载jacob的jar包,然后举个例子. public static final int WORD_HTML = 8; public static final ...

  3. [转]谈谈Java中"=="与"equals()"

    equals是Object超类中的一个方法,这个方法的实现就是通过==号实现的,==号比较的是两个对象的地址是否相同,在代码中体现出来就是比较两个对象引用中保存的地址是否相同,==能够判断的只是两个对 ...

  4. LoadRuner12.53教程(二)

    使用HP Web访问示例应用程序 shǐ使   yòng用   H   P   W   e   b   fǎng访   wèn问   shì示   lì例   yìng应   yòng用   chén ...

  5. Go 语言实践(一)

    本文由Austin发表 指导原则 我们要谈论在一个编程语言中的最佳实践,那么我们首先应该明确什么是"最佳".如果您们听了我昨天那场讲演的话,您一定看到了来自 Go 团队的 Russ ...

  6. jqgrid表头上面再加一行---二级表头

    实现效果如图,代码如下: $( "#table_list_1" ).jqGrid( 'setGroupHeaders' , { useColSpanStyle : true , / ...

  7. JavaWeb学习 (十)————Cookie

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  8. 来自于一个问题的回答对自己的反思 php怎么发送邮件?发送邮件插件PHPMailer

    前言: 昨天用手机无意点了一下博问,看见了一个朋友问了一个关于php发邮件不能添加发件人名称的问题,试着看了一下代码,觉得自己发现了问题所在,谁知道只是一知半解没有真正发现问题所在,看来有一段时间没有 ...

  9. [JZOJ5984] 仙人掌

    Description Solution 标算我并不会... 考虑一种根号思想 首先以 \(1\) 为根dfs整棵树 那么在任意时刻一个点的儿子的权值种类最多只会有 \(\sqrt m\) 种. 可以 ...

  10. 命令查看当前电脑安装所有版本.NET Core SKD

    dotnet --version 查看当前使用版本 dotnet --info 安装的所有版本 包括版本地址 也可用命令帮助 dotnet help