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; }
最难的第三条。心思了半天有两种解决方法,但都有缺陷
- 统一转换成Vector来计算
- 统一转换成Quaternion来计算
优缺点:
- 旋转时有卡顿不流畅,但是到位快
- 旋转时比第一种流畅一些也有些许卡顿,但到位不快甚至不到位。
对于这两种方式,主要的思路都是取鼠标滑动的单位向量然后乘以速度。
这两种都设计到一个比较坑爹的问题。
鼠标向上下滑动时:
- 针对鼠标来说是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
- Unity Game窗口中还原Scene窗口摄像机操作
- Unity Game窗口中还原Scene窗口摄像机操作 强化版
- unity的2D中物体在Scene窗口中可以看到,但在Game窗口中看不到
- Unity在Scene窗口有显示,在Game窗口不显示
- unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到
- unity窗口最大化最小化及窗口还原
- 【Unity】game窗口调试Debug
- Unity之编辑器类将摄像机视图(targetTexture)绘制在窗口中
- unity 实现Game窗口的Stats
- 在myeclipse中, 如何还原默认窗口?
- 在myeclipse中, 如何还原默认窗口?
- 在myeclipse中, 如何还原默认窗口?
- Unity的Scene场景选中物体Hierarchy窗口无法锁定选中的物体的问题
- codeblocks窗口还原
- vs还原窗口布局
- [Unity]将摄像机移动到Scene视角位置
- Unity 小技巧:Scene视图 和 Game视图 中 视角(Camera)的控制
- Unity中摄像机
- Linux多线程锁属性设置
- 支付宝--android应用程序如何调用支付宝接口
- 数据持久化
- Redis配置文件解读
- C++对C的扩展之bool(布尔类型)
- Unity Game窗口中还原Scene窗口摄像机操作
- AngularJS 指令详解(业界大牛的详细学习笔记)
- div中的元素是浮动导致兄弟元素没有换行
- 总结Hibernate(一)
- 高精度catalan数模板
- javax.validation.UnexpectedTypeException: HV000030: No validator could be found for type: java.lang
- 《python程序设计》第二章基本程序设计笔记
- ARToolKit增强现实实践文档
- CollectionView 添加/删除动画