Unity编辑器下场景(Scene)相机匀速运动解决方案
来源:互联网 发布:软件交互设计流程图 编辑:程序博客网 时间:2024/06/05 10:58
美术在使用Unity编辑地形时,提出了让场景相机匀速运动的需求,因为Unity原本的场景相机移动速度不可控,同时在移动过程中会加速。在网上找了很多没有确切的解决方案,Unity似乎也并没有提供相关的接口。笔者尝试了一种利用EditorWindow的Update刷新相机位置的方法,效果还不错。
首先创建一个EditorWindow,并在OnGui中提供速度的输入框。
如果仍使用Unity原有的相机控制快捷键,在持续运动相机一段时间后,Unity自带的相机速度会加到很大,而Unity自己处理Scene相机频率比Update快,即使我们在每次Update的时候手动设置了相机位置,仍然会造成相机位置突变,导致图像晃动。因此笔者采用了一组新的快捷键(方向键+鼠标右键)的组合,既不与现有操作冲突,又可以在移动过程中随时调整相机角度。
通过SceneView.onSceneGUIDelegate注册场景事件,捕捉按键变化,并在每个Update中获取相机角度,计算运动后的位置。
具体代码如下:
public class SceneCameraControlWindow : EditorWindow{ private string m_speedStr = "1"; private float m_speed = 1f; private bool m_enable = false; private Vector3 m_curMove; private void OnEnable() { SceneView.onSceneGUIDelegate += OnSceneFunc; } private void OnDisable() { SceneView.onSceneGUIDelegate -= OnSceneFunc; } private void OnGUI() { GUILayout.BeginHorizontal(); GUILayout.Label("速度:"); string newStr = GUILayout.TextField(m_speedStr); GUILayout.EndHorizontal(); GUILayout.Label("按住鼠标右键+方向键(↑、↓、←、→)移动相机"); float newSpeed; if(newStr != m_speedStr && float.TryParse(newStr, out newSpeed) && newSpeed >= 0) { m_speedStr = newStr; m_speed = newSpeed; } } private void Update() { if(m_enable && null != SceneView.lastActiveSceneView) { SceneView.lastActiveSceneView.pivot += (SceneView.lastActiveSceneView.camera.transform.rotation * m_curMove) * m_speed * Time.deltaTime; } } private void OnSceneFunc(SceneView target) { if (null == SceneView.lastActiveSceneView || target != SceneView.lastActiveSceneView) return; switch (Event.current.type) { case EventType.MouseDown: if(Event.current.button == 1) { m_enable = true; } break; case EventType.MouseUp: if (Event.current.button == 1) { m_enable = false; } break; case EventType.KeyDown: switch (Event.current.keyCode) { case KeyCode.UpArrow: m_curMove.z = 1f; break; case KeyCode.DownArrow: m_curMove.z = -1f; break; case KeyCode.LeftArrow: m_curMove.x = -1f; break; case KeyCode.RightArrow: m_curMove.x = 1f; break; } break; case EventType.KeyUp: switch (Event.current.keyCode) { case KeyCode.UpArrow: m_curMove.z = 0f; break; case KeyCode.DownArrow: m_curMove.z = 0f; break; case KeyCode.LeftArrow: m_curMove.x = 0f; break; case KeyCode.RightArrow: m_curMove.x = 0f; break; } break; } }}
阅读全文
0 0
- Unity编辑器下场景(Scene)相机匀速运动解决方案
- Unity Scene场景自定义坐标轴
- 【unity实用技能】unity编辑器工具之加载预制(Prefab)和场景(Scene)
- unity3d实现相机对场景物体的旋转、缩放、平移查看功能、近似于scene下查看场景的效果
- 场景Scene
- Unity在Scene下绘制图片
- Unity在Scene下绘制图片
- Unity扩展 检视面板(Inspector面板),编辑器窗口(自己定义的类似Inspector面板的窗口),scene场景 常用的类说明
- Unity编辑器-Scene面板里的万向锁现象
- cocos2d Scene场景转换
- cocos2d-X 场景Scene
- Cocos2dx 场景类-Scene
- Unity实现在场景中自由移动游览的相机
- Unity之Handles在Scene下绘制Label-十一
- 匀速运动
- 匀速运动
- 匀速运动
- Unity学习笔记(一)——基本概念之场景(Scene)
- 对于原生js中的事件委托解析
- Android的JNI【实战教程】6⃣️--温控计
- 前端基础笔记11
- PHP 常用字符串相关函数
- java中的简单工厂设计模式
- Unity编辑器下场景(Scene)相机匀速运动解决方案
- 多继承与虚继承
- DAY 4 初识fast-r-cnn
- meta标签
- vue cli+axios踩坑记录+拦截器使用,代理跨域proxy(更新)
- 扩展欧几里得
- vue开发:vue全局组件的方法
- BZOJ 3687: 简单题
- EM算法及其应用