打算写这样一个工具,可用于影片镜头调节,房产漫游的可视化,建立多个可视镜头,可以动态调整各个镜头的位置和旋转方向,同时,还能在类似于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. rust debug之基于pdb

    方法一: 用visual studio 步骤: 安装msvc工具链 rustup toolchain install stable-x86_64-pc-windows-msvc 切换到该工具链 rus ...

  2. 手写SpringMVC实现

    设计自己的MVC架构 1.读取配置通过web.xml中加载我们自己写的MyDispatcherServlet和读取配置文件. 2.初始化九大组件只需实现基本的:1).加载配置文件:2).扫描用户配置包 ...

  3. MGR实现分析 - 成员管理与故障恢复实现

    MySQL Group Replication(MGR)框架让MySQL具备了自动主从切换和故障恢复能力,举single primary(单主)模式为例,primary作为主节点对外提供读写服务,是唯 ...

  4. python通配符之glob模块

    转自:https://blog.csdn.net/dcrmg/article/details/78309469 官方链接:https://docs.python.org/3.6/library/glo ...

  5. js通過name获取input框输入值

    var account = $("input[name='account']").val();//获取input框输入值

  6. 捕获数据中的某个序列---verilog

    捕获数据中的某个序列---verilog 状态变化图 先是检测序列,每当接收到cmp_equal信号时跳转到下一个状态,等待另外一个cmp_equal信号到来. 代码: always @ * case ...

  7. Java Swing 界面中文乱码问题解决(Idea环境)

    编译(build)的时候和运行的时候使用同样的字符集就可以了.这里,我都设置为“UTF-8”.具体做当如下: File->Settings->Build...->Compiler,在 ...

  8. Optaplanner终于支持多线程并行运行 - Multithreaded incremental solving

    Optaplanner 7.9.0.Final之前,启动引擎开始对一个Problem进行规划的时候,只能是单线程进行的.也就是说,当引擎对每一个possible solution进行分数计算的过程中, ...

  9. HDFS简述

    管理网络中跨多台计算机存储的文件系统称为分布式文件系统,Hadoop自带HDFS(Hadoop Distributed Filesystem)分布式文件系统. 一.HDFS设计 HDFS以流式数据访问 ...

  10. navicat for mysql 注册码,简简单单,一个搞定(蔡军帅亲测有效)

    打开navicat for mysql接着打开帮助,选中注册, 把下面的复制上去就可以了 NAVH-WK6A-DMVK-DKW3 转载自:https://blog.csdn.net/qq_403845 ...