打算写这样一个工具,可用于影片镜头调节,房产漫游的可视化,建立多个可视镜头,可以动态调整各个镜头的位置和旋转方向,同时,还能在类似于Camera 的Preview这样的小窗口中查看该镜头(在小窗口中点击鼠标左键并拖拽能调节镜头的旋转轴向),示意图如下:

首先,第一步:创建一个脚本,公开两个参数(目前功能还有待丰富,后续更新...)

第二步:创建一个Editor脚本,开始在里面编辑内容,previewCamera即在小窗口中看到的Camera,将这个Camera看到的画面DrawCamera到SceneGUI即可实时预览

    若不添加可编辑多个

第三步:创建一个Camera的Component,让它的HideFlags设置为隐藏,previewCamera.enable是设置它是否在game窗口中可见,这里我们把它设为false,让它只在Scene窗口中可见。

第四步:在Scene窗口中绘制你的Camera镜头,判断鼠标是否在小窗口内,然后判断是否按下鼠标左键和是否拖拽,然后画面就会根据鼠标拖拽的增量来改变镜头的rotation。

    其中要注意的是:判断EventType为Repaint,再DrawCamera,不然该物体在Scene中不能用鼠标拖拽改变它的position。

第五步:重写OnInspectorGUI,绘制你的Inspector面板,将前面定义的两个属性加上,一个为是否开启Preview功能,另一个为你的镜头名称,镜头名称将直接显示在小窗口的最顶端。

第六步:最后在OnDisable的时候,若预览相机不为空,就将它删除掉,单一管理避免重复。

附上完整代码:

     using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor;
using UnityEngine; [CustomEditor(typeof(Preview)),CanEditMultipleObjects]
public class PreviewEditor : Editor { private Camera previewCamera;
private bool isEditingMultipleObjects = false; void OnEnable()
{
if (this.previewCamera != null)
{
UnityEngine.Object.DestroyImmediate(this.previewCamera.gameObject);
}
System.Type[] components = new System.Type[] { typeof(Camera) };
this.previewCamera = EditorUtility.CreateGameObjectWithHideFlags("Preview cam", HideFlags.HideAndDontSave, components).GetComponent<Camera>();
this.previewCamera.farClipPlane = 10000f;
this.previewCamera.enabled = false; }
private void OnSceneGUI()
{
if (!this.isEditingMultipleObjects)
{
Preview pv = (Preview)target;
this.previewCamera.transform.position = pv.transform.position;
this.previewCamera.transform.rotation = pv.transform.rotation;
if (pv.SetPreview)
{
Handles.BeginGUI();
Rect position = SceneView.currentDrawingSceneView.position;
position.x = position.width - 300f;
position.y = (position.height - 180f) - 20f;
position.width = 294f;
position.height = 174f;
Event current = Event.current; if (position.Contains(current.mousePosition))
{
if ((current.button == ) && (current.type == EventType.MouseDrag))
{
pv.transform.localEulerAngles = new Vector3(pv.transform.localEulerAngles.x + current.delta.y * 0.5f, pv.transform.localEulerAngles.y + current.delta.x * 0.2f, );
current.Use();
}
} GUI.Button(new Rect(position.x - , position.y - , position.width + , position.height + ), pv.textField.ToString(), GUI.skin.window); if (Event.current.type == EventType.Repaint)
{
Handles.DrawCamera(position, this.previewCamera);
}
Handles.EndGUI();
}
} } public override void OnInspectorGUI()
{
if (SceneView.currentDrawingSceneView != null)
{
SceneView.currentDrawingSceneView.Repaint();
}
base.serializedObject.Update();
Preview preview = (Preview)target;
preview.SetPreview = EditorGUILayout.Toggle("Preview", preview.SetPreview);
preview.textField = EditorGUILayout.TextField("请设置您的镜头名称:", preview.textField); this.isEditingMultipleObjects = base.serializedObject.isEditingMultipleObjects; }
private void OnDisable()
{
if (this.previewCamera != null)
{
UnityEngine.Object.DestroyImmediate(this.previewCamera.gameObject);
}
}
}

Preview.cs

Unity添加多个可视镜头Preview功能(一)的更多相关文章

  1. Unity添加多个可视镜头Preview功能(二)

    制作好并摆放好镜头以后,在Preview.cs里添加一个time单个镜头移动时间的变量,并在PreviewEditor下绘制在Inspector面板下. 然后,添加一个FollowPreviewPat ...

  2. C# Unity依赖注入利用Attribute实现AOP功能

    使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...

  3. 【转载】利用Unity自带的合图切割功能将合图切割成子图

    虽然目前网上具有切割合图功能的工具不少,但大部分都是自动切割或者根据plist之类的合图文件切割的, 这种切割往往不可自己微调或者很难维调,导致效果不理想. 今天逛贴吧发现了一位网友写的切割合图插件很 ...

  4. 小生功能贴<一> --- 动态添加应用 具有长按删除功能

    ---恢复内容开始--- 动态添加应用 具有长按删除功能 功能如下图:                (图片显示功能不是你要的,那就默默关闭页面吧) 设计思路: 页面一:用girdview网格显示图标 ...

  5. android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能

    Androidstudio 出现以下错误导致layout xml无法实现预览功能: Information:Gradle tasks [:dl_version:generateDebugSources ...

  6. MUI - 为textarea添加语音输入和清除的功能

    为textarea添加语音输入和清除的功能 mui支持input输入框语音输入和清除的功能,只需要添加相关css类即可. http://www.cnblogs.com/phillyx/ 代码如下 &l ...

  7. Unity Procedural Level Generator 基础总结与功能优化

    Procedural Level Generator是在Unity应用商店中发布的一款免费的轻量级关卡生成器: 可以直接搜索关键字在应用商店中查找并下载. 和我之前生成关卡的想法不同,这个插件生成地图 ...

  8. 使用JAVA编写电话薄程序,具备添加,查找,删除等功能

    //该程序需要连接数据库.根据word文档要求所有功能均已实现.//大部分方法基本差不多,//在查询修改的时候能输出 最大ID号 和最小ID号,并且可以对输入的ID号进行判断是否存在(具体方法请查看 ...

  9. python :添加的内容具有之前的功能用delegate绑定事件

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. DNS实战--1

    DNS(Domain Name System,域名系统)因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户方便的访问互联网,而不用去记住能够被机器读取的IP数串.通过主机名,最终得到该主 ...

  2. 分布式ID生成策略

    策略一.UUID 策略二.数据库自增序列 策略三.snowflake算法 策略四.基于redis自增 思路:利用增长计数API,业务系统在自增长的基础上,配合其他信息组装成为一个唯一ID. redis ...

  3. Java 动态绑定

    转载  http://www.cnblogs.com/ygj0930/p/6554103.html 一:绑定 把一个方法与其所在的类/对象 关联起来叫做方法的绑定.绑定分为静态绑定(前期绑定)和动态绑 ...

  4. python实现将字符串中以大写字母开头的单词前面添加“_”下划线

    在工作中写测试用例代码生成的时候,函数命令考虑采用参数文件的名称来命名,但是发现文件命名是驼峰的写写法,所以想按照字符串中的大写字母做分割,每个单词前面添加下划线,主要考虑采用正则的模式来匹配,替换然 ...

  5. myEclipse+Spring boot+Hbuilder+jwt Token+mongoDB+企业微信H5开发

    企业微信应用的H5开发 1.参考文档:weUI:http://jqweui.com/ 2.企业微信接口文档:https://work.weixin.qq.com/api/doc#10029 3.百度地 ...

  6. go 语言之 生产者消费模型

    简易的生产者消费模型,通过管道[也可以理解为队列],管道是先进先出,主要是理解chan 生产者使用make将chan初始化,并且设置chan长度,如果不设置,生产者就写入不了通道 go 是使用线程开始 ...

  7. Skin Microstructure Deformation with Displacement Map Convolution项目小结

    经常有人问我你最近在干什么,但一句话真的很难说明白,最近两个月一直在尝试将Skin Microstructure Deformation with Displacement Map Convoluti ...

  8. Vue.js中ref ($refs)用法举例总结

    原文地址:http://www.cnblogs.com/xueweijie/p/6907676.html <div id="app"> <input type=& ...

  9. CentOS7下安装Python3并保留Python2

    1. 安装make编译指令的依赖环境 # yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel ...

  10. JavaScript易混淆的零碎知识点积累

    1.callee属性 和 caller属性. 区别:两者的调用对象不同 arguments.callee:指向拥有这个arguments对象的函数,在递归运算中经常用到. functionName.c ...