扩展需求

在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. 理解express中的中间件

    express是轻量灵活的node.js Web应用框架”.它可以帮助你快速搭建web应用.express是一个自身功能极简,完全是由**路由**和**中间件**构成的一个web开发框架,本质上说,一 ...

  2. Java提高篇之理解java的三大特性——封装

    三大特性之—封装 封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐 ...

  3. Algolia使用教程 , 超详细傻子看都会

    框架描述 发现网上Algolia这块的资料较少,就花了点时间从官网上整理了下,总结了几项常用的功能用法. 现在比较有名的Algolia提供了云搜索的服务.具体办法是我们将数据库的信息以JSON的格式上 ...

  4. [转]Angular4 引用 material dialog时自定义对话框/deep/.mat-dialog-container

    本文转自:https://blog.csdn.net/qq_24078843/article/details/78560556 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  5. typeof() 和 GetType()区是什么

    1.typeof(x)中的x,必须是具体的类名.类型名称等,不可以是变量名称. 2.GetType()方法继承自Object,所以C#中任何对象都具有GetType()方法,它的作用和typeof() ...

  6. Extjs 项目中常用的小技巧,也许你用得着(2)

    接着来,也是刚刚遇到的 panel怎么进行收缩 collapsible: true, 这会panel就会出现这个 点这个就可以收缩了 panel怎么随便拉伸,也就是让那个小黑三角出现 split: t ...

  7. c#方法转异步例子

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. C# ACtiveMQ 收发数据

    1.下载ActiveMQ 官方网站下载地址:http://activemq.apache.org/ 2.运行ActiveMQ 解压缩apache-activemq-5.10.0-bin.zip,然后双 ...

  9. 【原】ActiveMq实现分布式事务一致性

    前言:关于分布式事务话题一直是颇有争议的话题,在本文中通过ActiveMq 实现分布式事务做一个简单的demo;同时也让自己能在实践中可以获取经验和对分布式事务自己的一些思考. 1.本地事务 我们通常 ...

  10. 【IDEA&&Eclipse】3、IntelliJ IDEA 的 20 个代码自动完成的特性

    在这篇文章中,我想向您展示 IntelliJ IDEA 中最棒的 20 个代码自动完成的特性,可让 Java 编码变得更加高效.对任何集成开发环境来说,代码的自动完成都是最最重要的一项功能,它根据你输 ...