Unity添加多个可视镜头Preview功能(一)
打算写这样一个工具,可用于影片镜头调节,房产漫游的可视化,建立多个可视镜头,可以动态调整各个镜头的位置和旋转方向,同时,还能在类似于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功能(一)的更多相关文章
- Unity添加多个可视镜头Preview功能(二)
制作好并摆放好镜头以后,在Preview.cs里添加一个time单个镜头移动时间的变量,并在PreviewEditor下绘制在Inspector面板下. 然后,添加一个FollowPreviewPat ...
- C# Unity依赖注入利用Attribute实现AOP功能
使用场景? 很多时候, 我们定义一个功能, 当我们要对这个功能进行扩展的时候, 按照常规的思路, 我们一般都是利用OOP的思想, 在原有的功能上进行扩展. 那么有没有一种东西, 可以实现当我们需要扩展 ...
- 【转载】利用Unity自带的合图切割功能将合图切割成子图
虽然目前网上具有切割合图功能的工具不少,但大部分都是自动切割或者根据plist之类的合图文件切割的, 这种切割往往不可自己微调或者很难维调,导致效果不理想. 今天逛贴吧发现了一位网友写的切割合图插件很 ...
- 小生功能贴<一> --- 动态添加应用 具有长按删除功能
---恢复内容开始--- 动态添加应用 具有长按删除功能 功能如下图: (图片显示功能不是你要的,那就默默关闭页面吧) 设计思路: 页面一:用girdview网格显示图标 ...
- android Information:Gradle tasks [:dl_version:generateDebugSources, :dl_version:generateDebugAndroidTestSources导致无法实现Preview功能
Androidstudio 出现以下错误导致layout xml无法实现预览功能: Information:Gradle tasks [:dl_version:generateDebugSources ...
- MUI - 为textarea添加语音输入和清除的功能
为textarea添加语音输入和清除的功能 mui支持input输入框语音输入和清除的功能,只需要添加相关css类即可. http://www.cnblogs.com/phillyx/ 代码如下 &l ...
- Unity Procedural Level Generator 基础总结与功能优化
Procedural Level Generator是在Unity应用商店中发布的一款免费的轻量级关卡生成器: 可以直接搜索关键字在应用商店中查找并下载. 和我之前生成关卡的想法不同,这个插件生成地图 ...
- 使用JAVA编写电话薄程序,具备添加,查找,删除等功能
//该程序需要连接数据库.根据word文档要求所有功能均已实现.//大部分方法基本差不多,//在查询修改的时候能输出 最大ID号 和最小ID号,并且可以对输入的ID号进行判断是否存在(具体方法请查看 ...
- python :添加的内容具有之前的功能用delegate绑定事件
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- .Net Core 没有 WebForm 是 历史 的 退步, MVC 是一个 糟糕 的 设计
WebForm 自面世以来, 广受广大开发人员的欢迎 . 当然, WebForm 有一些 著名的 弊病, 比如 笨重的 ViewState . 不过 我们 可以 用 一些 更加 先进 和 灵巧 的 ...
- 我发起了一个 用 C# 写 的 浏览器 开源项目 HtmlCore
我之前还发起过一个 项目, 名字也叫 HtmlCore, 见 <我发起了一个 .Net 开源 跨平台 GUI (界面开发框架)项目 HtmlCore> https://www.cnblo ...
- 出现No package gcc+ available解决办法
系统 CentOS Linux release 7.4.1708 (Core) 安装gcc时报错 [root@ip---- node-v10.15.3]# yum -y install gcc+ ...
- 记一次nmap扫描信息收集过程
1.首先扫描网段内存活主机 nmap -sP 192.168.1.1-254 2.获取到存活主机后,开始进行端口扫描 nmap -p1-1000 192.168.1.66 可得到端口状态: filte ...
- sequelize 中文文档
https://demopark.github.io/sequelize-docs-Zh-CN/
- transform、transition、animation 区别
Transform 在部分的test case当中,每每演示transform属性的,看起来好像都是带动画.这使得小部分直觉化思维的人(包括我)认为transform属性是动画属性.而恰恰相反,tra ...
- 【dbdiff】数据库比对工具安装
安装git 忽略 安装visual c++组件(和mysql workbench需要的一样) https://www.microsoft.com/en-us/download/details.aspx ...
- MSF banner
____________ [%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%| $a, |%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%] [%%%%%%%%%%%%%% ...
- selenium常用的API
打开浏览器 driver.get("http://www.baidu.com") 最大化浏览器 driver.maximize_window() 关闭浏览器 driver.quit ...
- select拼接
//if (Data1[i].MisFunId == 1) //{ // if (Data1[i].Flag == true) // { // var t = Data1[i].MisFunId; / ...