zoukankan      html  css  js  c++  java
  • Unity Game窗口中还原Scene窗口摄像机操作

    最近在弄AI,调试程序的时候总是要调整摄像机的视角。灰常不爽然后自己写了个脚本。比较习惯Scene窗口下的摄像机操作所以就仿造了一个一样的操作脚本。

    首相我们要知道Scene下的摄像机的操作方式

    1.WASD分别控制前后左右的位移,注意:位移是已当前视角为基准的。

    2.QE分别控制上下,注意:这个是针对世界坐标的。

    3.鼠标右键控制自由视角旋转。(难点)

    对于第一条来说,主要的问题就是现在玩家朝向问题。我怎么知道我面向哪里。

            Vector3 Face = transform.rotation * Vector3.forward;
            Face = Face.normalized;

    这段代码就是玩家的朝向,把目前玩家的旋转角度乘上向量的前方,就是玩家的面朝方向,因为我们就要方向,所以单位向量化了。

    下面就是关于第一条的控制方式。

            Vector3 Face = transform.rotation * Vector3.forward;
            Face = Face.normalized;
    
            Vector3 Left = transform.rotation * Vector3.left;
            Left = Left.normalized;
    
            Vector3 Right = transform.rotation * Vector3.right;
            Right = Right.normalized;
    
            if (Input.GetKey("w"))
            {
                transform.position += Face * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("a"))
            {
                transform.position += Left * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("d"))
            {
                transform.position += Right * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("s"))
            {
                transform.position -= Face * Speed * Time.deltaTime;
            }

    第二条就不用多说了吧。上代码

            if (Input.GetKey("q"))
            {
                transform.position -= Vector3.up * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("e"))
            {
                transform.position += Vector3.up * Speed * Time.deltaTime;
            }

    最难的第三条。心思了半天有两种解决方法,但都有缺陷

    1)统一转换成Vector来计算

    2)统一转换成Quaternion来计算

    优缺点:

    1)旋转时有卡顿不流畅,但是到位快

    2)旋转时比第一种流畅一些也有些许卡顿,但到位不快甚至不到位。

    对于这两种方式,主要的思路都是取鼠标滑动的单位向量然后乘以速度。

    这两种都设计到一个比较坑爹的问题。

    鼠标向上下滑动时:

    针对鼠标来说是y轴加减

    针对rotation来说是x轴减加

    同理鼠标左右滑动时:

    针对鼠标来说是x轴减加

    针对rotation来说是y轴减加

    所以这段代码就很重要

                //_Rot是物体当前rotation值,MovePos是修改的值,最后得旋转后的值
                _Rot.x -= MovePos.y * 2; //*2是可以调节的速度,越大越快
                _Rot.y += MovePos.x * 2;
                _Rot.z += MovePos.z * 2

    然后对于第一种方式全部变为Vector处理我们就会用到Transform.eulerAngles;

    代码为

                Vector3 Save = Input.mousePosition;
                Vector3 MovePos = Save - MouseDownPos;
                MovePos = MovePos.normalized;
                Vector3 _Rot = transform.rotation.eulerAngles;
                _Rot.x -= MovePos.y * 2;
                _Rot.y += MovePos.x * 2;
                _Rot.z += MovePos.z * 2;
                transform.eulerAngles = _Rot;
                Debug.Log(MovePos);
                MouseDownPos = Save;

    对于第二种方式全部变为Quaternion处理我们用Quaternion.Slerp

    代码为

                Vector3 Save = Input.mousePosition;
                Vector3 MovePos = Save - MouseDownPos;
                MovePos = MovePos.normalized;
                Vector3 _Rot = transform.rotation.eulerAngles;
                _Rot.x -= MovePos.y * 2;
                _Rot.y += MovePos.x * 2;
                _Rot.z += MovePos.z * 2;
                Quaternion MoveRot = Quaternion.Euler(_Rot);
                transform.rotation = Quaternion.Slerp(transform.rotation, MoveRot, Time.deltaTime * 30);
                MouseDownPos = Save;

    最后给完整的Update代码

        private float Speed = 5;
        private Vector3 MouseDownPos;
        
        void Update ()
        {
            Vector3 Face = transform.rotation * Vector3.forward;
            Face = Face.normalized;
    
            Vector3 Left = transform.rotation * Vector3.left;
            Left = Left.normalized;
    
            Vector3 Right = transform.rotation * Vector3.right;
            Right = Right.normalized;
    
            //Debug.Log(transform.rotation * Vector3.forward + "," + transform.rotation * Vector3.left + "," + transform.rotation * Vector3.right);
    
            if (Input.GetMouseButtonDown(1))
            {
                MouseDownPos = Input.mousePosition;
            }
    
            if (Input.GetMouseButton(1))
            {
                //Vector处理
                Vector3 Save = Input.mousePosition;
                Vector3 MovePos = Save - MouseDownPos;
                MovePos = MovePos.normalized;
                Vector3 _Rot = transform.rotation.eulerAngles;
                _Rot.x -= MovePos.y * 2;
                _Rot.y += MovePos.x * 2;
                _Rot.z += MovePos.z * 2;
                transform.eulerAngles = _Rot;
                Debug.Log(MovePos);
                MouseDownPos = Save;
    
                //Quaternion处理
                //Vector3 Save = Input.mousePosition;
                //Vector3 MovePos = Save - MouseDownPos;
                //MovePos = MovePos.normalized;
                //Vector3 _Rot = transform.rotation.eulerAngles;
                //_Rot.x -= MovePos.y * 2;
                //_Rot.y += MovePos.x * 2;
                //_Rot.z += MovePos.z * 2;
                //Quaternion MoveRot = Quaternion.Euler(_Rot);
                //transform.rotation = Quaternion.Slerp(transform.rotation, MoveRot, Time.deltaTime * 30);
                //MouseDownPos = Save;
            }
    
            if (Input.GetKey("w"))
            {
                transform.position += Face * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("a"))
            {
                transform.position += Left * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("d"))
            {
                transform.position += Right * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("s"))
            {
                transform.position -= Face * Speed * Time.deltaTime;
            }
            
            if (Input.GetKey("q"))
            {
                transform.position -= Vector3.up * Speed * Time.deltaTime;
            }
    
            if (Input.GetKey("e"))
            {
                transform.position += Vector3.up * Speed * Time.deltaTime;
            }
    
        }
  • 相关阅读:
    应用文档iOS, 在应用之间共享文档。
    项目范围项目管理项目范围管理
    网站教程一些学习网站
    布局文件Android ListView入门知识各种Adapter配合使用
    随波逐流希望2013年半年小总结(复杂艰难的半年)
    安全微软微软安全新闻聚焦双周刊第三十二期
    对象类《大话设计模式》部分模式总结(一):
    循环跳转JAVA Continue实例详解
    节点程序寻找链表倒数第k个节点
    box2d编译
  • 原文地址:https://www.cnblogs.com/SHOR/p/5499194.html
Copyright © 2011-2022 走看看