Unity Game窗口中还原Scene窗口摄像机操作

来源:互联网 发布:花千骨御剑进阶数据 编辑:程序博客网 时间:2024/05/24 07:23

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

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

  • WASD分别控制前后左右的位移,注意:位移是已当前视角为基准的。
  • QE分别控制上下,注意:这个是针对世界坐标的。
  • 鼠标右键控制自由视角旋转。(难点)

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

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