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;    }  }}
原创粉丝点击