Unity添加多个可视镜头Preview功能(一)

摘要:
附上完整代码:1使用系统;2使用System.Collections。通用的3使用系统。林克;4使用UnityEditor;5使用UnityEngine;67[CustomEditor,CanEditMultipleObjects]8publicclassPreviewEditor:编辑器{910privateCamerapreviewCamera;11privateboolisEditingMultiple对象=false;1213voidOnEnable()14{15if(this.previewCama!

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

Unity添加多个可视镜头Preview功能(一)第1张

Unity添加多个可视镜头Preview功能(一)第2张

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

Unity添加多个可视镜头Preview功能(一)第3张

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

若不添加可编辑多个

Unity添加多个可视镜头Preview功能(一)第4张

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

Unity添加多个可视镜头Preview功能(一)第5张

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

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

Unity添加多个可视镜头Preview功能(一)第6张

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

Unity添加多个可视镜头Preview功能(一)第7张

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

Unity添加多个可视镜头Preview功能(一)第8张

附上完整代码:

1     usingSystem;
2     usingSystem.Collections.Generic;
3     usingSystem.Linq;
4     usingUnityEditor;
5     usingUnityEngine;
6 
7 [CustomEditor(typeof(Preview)),CanEditMultipleObjects]
8 public classPreviewEditor : Editor {
9 
10     privateCamera previewCamera;
11     private bool isEditingMultipleObjects = false;
12 
13     voidOnEnable()
14 {
15         if (this.previewCamera != null)
16 {
17             UnityEngine.Object.DestroyImmediate(this.previewCamera.gameObject);
18 }
19         System.Type[] components = new System.Type[] { typeof(Camera) };
20         this.previewCamera = EditorUtility.CreateGameObjectWithHideFlags("Preview cam", HideFlags.HideAndDontSave, components).GetComponent<Camera>();
21         this.previewCamera.farClipPlane =10000f;
22         this.previewCamera.enabled = false;
23 
24 }
25     private  voidOnSceneGUI()
26 {
27         if (!this.isEditingMultipleObjects)
28 {
29             Preview pv =(Preview)target;
30             this.previewCamera.transform.position =pv.transform.position;
31             this.previewCamera.transform.rotation =pv.transform.rotation;
32             if(pv.SetPreview)
33 {
34 Handles.BeginGUI();
35                 Rect position =SceneView.currentDrawingSceneView.position;
36                 position.x = position.width -300f;
37                 position.y = (position.height - 180f) -20f;
38                 position.width =294f;
39                 position.height =174f;
40                 Event current =Event.current;
41 
42                 if(position.Contains(current.mousePosition))
43 {
44                     if ((current.button == 0) && (current.type ==EventType.MouseDrag))
45 {
46                         pv.transform.localEulerAngles = new Vector3(pv.transform.localEulerAngles.x + current.delta.y * 0.5f, pv.transform.localEulerAngles.y + current.delta.x * 0.2f, 0);
47 current.Use();
48 }
49 }
50 
51                 GUI.Button(new Rect(position.x - 6, position.y - 8, position.width + 10, position.height + 10), pv.textField.ToString(), GUI.skin.window);
52 
53                 if (Event.current.type ==EventType.Repaint)
54 {
55                     Handles.DrawCamera(position, this.previewCamera);
56 }
57 Handles.EndGUI();
58 }
59 }
60 
61 }
62 
63     public override voidOnInspectorGUI()
64 {
65         if (SceneView.currentDrawingSceneView != null)
66 {
67 SceneView.currentDrawingSceneView.Repaint();
68 }
69         base.serializedObject.Update();
70         Preview preview =(Preview)target;
71         preview.SetPreview = EditorGUILayout.Toggle("Preview", preview.SetPreview);
72         preview.textField = EditorGUILayout.TextField("请设置您的镜头名称:", preview.textField);
73 
74         this.isEditingMultipleObjects = base.serializedObject.isEditingMultipleObjects;
75 
76 }
77     private voidOnDisable()
78 {
79         if (this.previewCamera != null)
80 {
81             UnityEngine.Object.DestroyImmediate(this.previewCamera.gameObject);
82 }
83 }
84 }
Preview.cs

免责声明:文章转载自《Unity添加多个可视镜头Preview功能(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi类型转换Panda3D获取鼠标位置的方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Unity游戏开发】AssetBundle杂记--AssetBundle的二三事

一、简介   马三在公司大部分时间做的都是游戏业务逻辑和编辑器工具等相关工作,因此对Unity AssetBundle这块的知识点并不是很熟悉,自己也是有打算想了解并熟悉一下AssetBundle,掌握一下Unity资源管理方面的知识,因此有了这篇博客。   我会在博客中整理出一些自己学习时收集到的一些比较好的AssetBundle学习资料,并且结合现在正...

css中position(absolute)与margin同时使用的情况

1,当元素绝对定位以后,它在父元素的位置是根据top/left/right/bottom来定位的,而margin是根据自身当前位置来定位的2,当它距离父元素left:50%,top:50%,那就是父元素一半的距离,因为要实现居中即自身的中点在父元素的中间才算,所以margin-left/margin-top 负的自身宽/高的一半,那么正好水平垂直居中。3,...

通过Unity导出的Android Studio和Google安卓原生工程的结构图对比

使用Unity导出Android Studio工程前建议查看我之前的文章《Unity2019及Unity2020打包android的环境配置》,替换或修改Unity安装目录下的baseProjectTemplate.gradle,把链接指向国内能加快下载速度。 说明:我把Android Studio简称为AS 本文记录一下Android Stuiod中原生...

[Unity基础]移动平台下的文件读写

From:http://blog.csdn.net/lyh916/article/details/52161633 参考链接: http://www.cnblogs.com/murongxiaopifu/p/4199541.html?utm_source=tuicool#autoid-3-2-0 http://zhaolongchn.blog.163...

unity事件机制

voidStart () { //发送给自身的所有脚本 //SendMessage("GetMessage", this.gameObject, SendMessageOptions.RequireReceiver); //发送给自身的所有脚本以及自身父物体,父物体的父物体等身上所有脚本...

Unity 多屏(分屏)显示,Muti_Display

Unity 多屏(分屏)显示,Muti_Display  最近项目有个需求,主要用于在展厅的展示游戏。 比如,在一个很大的展厅,很大的显示屏挂在墙上,我们不可能通过操作墙上那块显示器上的按钮来控制游戏。这时候有一个小的显示器(比如一个控制器或者一个手机)我们要做的是:挂在墙上的大显示器用来展示3D游戏场景,而所有的UI控制则全部显示在“控制器“上。这在U...