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/ ...
随机推荐
- 调整Eclipse中代码字体字号
Window-->preferences-->general-->appearence-->Colors and fonts中的Basic节点选text font,Edit一下
- mongodb shell 运行js脚本的四种方式
1. 交互式 mongo shell 大部分的 mongodb 教程,在第一章都会讲解这种方式. mongo 127.0.0.1:27017 use test db.users.findOne() ...
- nexus3.14.0版本linux环境安装、启动、搭建私库
本文介绍的是nexus3.14.0版本在linux环境下安装.启动.搭建私库. nexus3以上的版本太新了,网上很少介绍安装细节的.据了解和2.X版本有所不同了. 1.前提 linux机器上需先安装 ...
- python css选择器
css 选择器 <!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
- android 使用Canvas画箭头
public class MyCanvas extends View{ private Canvas myCanvas; private Paint myPaint=new Pai ...
- How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
How To Upgrade ASMLib Kernel Driver as Part of Kernel Upgrade? (文档 ID 1391807.1)
- [Notepad++]Notepad++怎么实现双视图/双窗口?
作为windows下非常优秀的开源代码编辑器,Notepad++是工程师必备代码编辑器.相比较之下,老一辈文本编辑器如ultraedit,editplus,就显得繁琐.冗余.疲惫.我使用过Notepa ...
- 给查询出的SQL记录添加序号列,解决方法有以下两种
第一: select ROW_NUMBER() OVER (ORDER BY a.字段 ASC) AS XUHAO,a.* from table a (table 为表名,字段为表a中的字段名) 第二 ...
- Koa2
安装 yarn add koa 代码 Koa的核心代码就三行 const app = new Koa() app.use(middleware) app.listen(3000) const Koa ...
- 关于mpi的理论知识以及编写程序来实现数据积分中的梯形积分法。
几乎所有人的第一个程序是从“hello,world”程序开始学习的 #include "mpi.h" #include <stdio.h> int main(int a ...