我是靠谱客的博主 称心白羊,最近开发中收集的这篇文章主要介绍UnityEditor编辑器扩展自己实现了一遍SceneView的镜头移动基本实现二次迭代最终结果,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

基本实现

由于最近一个星期都比较魔怔《天际线》,突然开始要工作了,用Editor好像突然没了按键反而不习惯

就是要实现一个点击AWSD,能方便编辑地图的功能

其实大可不必自己写代码

  • 本身Unity自带的,飞跃模式已经包含(按鼠标右键)AWSD

就是如下图,摄像机要有一点角度,肯定不是直角的移动

(图片来自CSDN某小哥的贴图)

protected virtual void OnScene(SceneView obj)
{
    Event e =        Event.current;
    if (e.type == EventType.KeyDown)
    {
       
if (e.keyCode == KeyCode.A || e.keyCode == KeyCode.S || e.keyCode == KeyCode.D ||
       
e.keyCode == KeyCode.W)
       
{
            // obj   
is SceneView
            float h = 0;
            float v = 0;
            if (e.keyCode == KeyCode.A)
               
h = -1;
            else if (e.keyCode == KeyCode.D)
               
h = 1;
            else if (e.keyCode == KeyCode.W)
               
v = 1;
            else if (e.keyCode == KeyCode.S)
               
v = -1;
            Vector3 targetDirection = new Vector3(h, 0, v);
            float y = obj.camera.transform.rotation.eulerAngles.y;
            targetDirection = Quaternion.Euler(0, y, 0) * targetDirection;
               
//
//TODO:按Shift加速(e.control && e.keyCode == KeyCode.Z)
               
//
//obj.camera.transform.Translate(targetDirection );//直接改camera 这句代码没用
               
//
            obj.pivot += targetDirection * Time.deltaTime * 3;
        }
    }
}
        
//打开EditorWindow扩展时,需调用
protected virtual void OnEnable()
{
SceneView.duringSceneGui += OnScene;
}
protected virtual void OnDisable()
{
SceneView.duringSceneGui -= OnScene;
}

是不是就是这么简单?

写代码肯定就没这么简单

结果后来我又调试了两个小时

二次迭代

========== 如果你要的仅仅只是Hello World 代码 ======

上面代码够了,下面代码很乱不要看

原因就是

keyDown只能在GUI用,第一下和第二下还有延迟,为了更顺滑的响应,只能用上。Update了


protected virtual void OnEnable()
{
onRefreshWindow -= Refresh;
onRefreshWindow += Refresh;
SceneView.duringSceneGui += OnScene;
EditorApplication.update += OnSceneUpdate;
}
protected virtual void OnDisable()
{
onRefreshWindow -= Refresh;
BlockClicks(false);
SceneView.duringSceneGui -= OnScene;
EditorApplication.update -= OnSceneUpdate;
}
    private int longPressCount;
private SceneView view;
private float longPressH = 0;
private float longPressV = 0;
private float longPressY = 0;//camera y Angle
private int longPressCountDown = 0;//允许多个按键AWSD多按 ,可以省几个变量了,不改了,睡觉
private void OnSceneUpdate()
{
if (view == null) return;
if (longPressCount > 0)
{
var targetDirection = new Vector3(longPressH, 0, longPressV);
//
//xxxx判斷長按,跳過第一下按下xxxx
//
//MD,第一下不能跳过,又需要马上有反应,。。。。。。。。longPressCount>0 逻辑就是为了这个
//
//
if (longPressCount == 1) return;
// //
Debug.LogError("ffff key=" + e.keyCode + " pos>" + view.camera.transform.position);
//
Vector3 targetDirection = new Vector3(longPressH, 0, longPressV);
//
//
float y = view.camera.transform.rotation.eulerAngles.y;
targetDirection = Quaternion.Euler(0, longPressY, 0) * targetDirection;
//
//TODO:按Shift加速(e.control && e.keyCode == KeyCode.Z)
view.pivot += targetDirection * Time.deltaTime * 3;
}
}
   
protected virtual void OnScene(SceneView obj)
{
    Event e = Event.current;
if (e.type == EventType.KeyDown)
{
if (e.keyCode == KeyCode.A || e.keyCode == KeyCode.S || e.keyCode == KeyCode.D ||
e.keyCode == KeyCode.W)
{
if (e.keyCode == KeyCode.A)
longPressCountDown
|= 1 << 1;
else if (e.keyCode == KeyCode.W)
longPressCountDown |= 1 << 2;
else if (e.keyCode == KeyCode.S)
longPressCountDown |= 1 << 3;
else if (e.keyCode == KeyCode.D)
longPressCountDown |= 1 << 4;
Debug.LogError("longPressCount=" + longPressCountDown);
longPressCount++;
if (view == null)
view = obj;
longPressY = obj.camera.transform.rotation.eulerAngles.y;
longPressH = 0;
longPressV = 0;
if (e.keyCode == KeyCode.A)//注意,为了第一下,这下面几个逻辑也是改过的
longPressH = -1;
if (e.keyCode == KeyCode.D)
longPressH = 1;
if (e.keyCode == KeyCode.W)
longPressV = 1;
if (e.keyCode == KeyCode.S)
longPressV = -1;
}
}
else if (e.type == EventType.KeyUp)
{
if (e.keyCode == KeyCode.A)
longPressCountDown
&= ~(1 << 1);
else if (e.keyCode == KeyCode.W)
longPressCountDown &= ~(1 << 2);
else if (e.keyCode == KeyCode.S)
longPressCountDown &= ~(1 << 3);
else if (e.keyCode == KeyCode.D)
longPressCountDown &= ~(1 << 4);
if(longPressCountDown==0)
//判斷長按,跳過第一下按下
longPressCount = 0;
}
}
    }

最终结果

好了,谢谢阅读,下一篇会说下,SceneView的笔刷Brush吧

最后

以上就是称心白羊为你收集整理的UnityEditor编辑器扩展自己实现了一遍SceneView的镜头移动基本实现二次迭代最终结果的全部内容,希望文章能够帮你解决UnityEditor编辑器扩展自己实现了一遍SceneView的镜头移动基本实现二次迭代最终结果所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(49)

评论列表共有 0 条评论

立即
投稿
返回
顶部