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是可以调节的速度,越大越快
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
然后对于第一种方式全部变为Vector处理我们就会用到Transform.eulerAngles;
代码为
Vector3 Save = Input.mousePosition;
Vector3 MovePos = Save - MouseDownPos;
MovePos = MovePos.normalized;
Vector3 _Rot = transform.rotation.eulerAngles;
_Rot.x -= MovePos.y * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
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 * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
Quaternion MoveRot = Quaternion.Euler(_Rot);
transform.rotation = Quaternion.Slerp(transform.rotation, MoveRot, Time.deltaTime * );
MouseDownPos = Save;
最后给完整的Update代码
private float Speed = ;
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())
{
MouseDownPos = Input.mousePosition;
} if (Input.GetMouseButton())
{
//Vector处理
Vector3 Save = Input.mousePosition;
Vector3 MovePos = Save - MouseDownPos;
MovePos = MovePos.normalized;
Vector3 _Rot = transform.rotation.eulerAngles;
_Rot.x -= MovePos.y * ;
_Rot.y += MovePos.x * ;
_Rot.z += MovePos.z * ;
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;
} }
Unity Game窗口中还原Scene窗口摄像机操作的更多相关文章
- Unity Game窗口中还原Scene窗口摄像机操作 强化版
之前写的那个版本看来真的是不行啊.最近研究了一下官方第一人称脚本,人家的平滑过渡真的是没得说.借鉴了一下,写出来了一个新的比较完美的控制. 之前我们的操作是通过鼠标输入的开始坐标和转动坐标.其实官方有 ...
- C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常,不存在从对象类型System.Windows.Forms.DateTimePicker到已知的托管提供程序本机类型的映射。
一:C#在父窗口中调用子窗口的过程(无法访问已释放的对象)异常 其实,这个问题与C#的垃圾回收有关.垃圾回收器管 理所有的托管对象,所有需要托管数据的.NET语言(包括 C#)都受运行库的 垃圾回收器 ...
- (转)C#在父窗口中调用子窗口的过程(无法访问已释放的对象)
C#在父窗口中调用子窗口的过程: 1. 创建子窗口对象 2. 显示子窗口对象 笔者的程序中,主窗体MainFrm通过菜单调用子窗口ChildFrm.在窗体中定义了子窗口对象,然后在菜单项点击事件中 ...
- Wpf窗口中打开WinForm窗口
获取wpf窗口对应的句柄窗口 using System; using System.Windows; using System.Windows.Interop; using IWin32Window ...
- C# A窗口内容显示在B窗口中的方法
HeScripts script = new HeScripts(); //A窗口中实例化B窗口 string okscripts = "test"; //设置字段内容 scrip ...
- C#中关闭子窗口而不释放子窗口对象的方法
1 在主窗口中实例化子窗口 在主窗口中实例化子窗口,而不是在按钮中实例化子窗口对象. Form2 f2 = new Form2(); 2 通过按钮来显示主窗口 在按钮中需要实现的是窗口的显示 priv ...
- 在SOUI中非半透明窗口如何实现圆角窗口?
如果SOUI的宿主窗口没有包含子窗口,直接使用窗口的半透明属性:translucent=1就可以解决了,整个窗口形状完全由背景图决定,可以实现完美的圆角. 然后窗口半透明时,窗口中的子窗口(非SWin ...
- jQuery 获取父窗口的元素 父窗口 子窗口(iframe)
$("#父窗口元素ID",window.parent.document); 对应javascript版本为window.parent.document.getElementById ...
- C#关闭子窗口而不释放子窗口对象的问题解决
在网上找来一些方式,感觉还都不错,下面给出方式: 在线扫描相机的调试过程中,需要开辟调试界面来进行位置的配置.调试结束后,一种常用的方式是将调试参数保存并在下次启动时加载.另一种简单方式是直接使用该参 ...
随机推荐
- 集合2--毕向东java基础教程视频学习笔记
Day14 08 LinkedList09 LinkedList练习10 ArrayList练习11 ArrayList练习2 12 HashSet13 HashSet存储自定义对象14 HashSe ...
- asp.net signalR 专题—— 第二篇 对PersistentConnection持久连接的快速讲解
上一篇我们快速的搭建了一个小案例,但是并没有对其中的方法进行介绍,这一篇我来逐一解析下. 一:从override的那些方法说起 不管怎么样,我们先上代码,如下: public class MyConn ...
- ligerDialog的使用
1.通过ViewBag来传值. @if (ViewBag.ReturnMessage != null) 2.脚本代码: 对话框设计与赋值问题. <script type="text/j ...
- C#--字符、字符串学习
字符 在.NET Framework中,每个字符都是System.Char结构的一个实例.System.Char类型很简单,提供了两个公共只读常量字段:MinValue和MaxValue. GetNu ...
- hibernate基础dao类
此文章是基于 搭建SpringMVC+Spring+Hibernate平台 功能:数据库的保存.更新.删除:sql.hql查询:分页查询:调用存储过程 创建hibernate基础dao类: BaseD ...
- 烂泥:阿里云RDS本地恢复数据
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司目前使用的数据库是阿里云的RDS,目前RDS的版本为mysql5.6.如下: 现在要 ...
- 在C#中该如何阻止虚方法的覆写
在开发过程中,我们为了让一个类更有生命力,有时会用virtual来修饰一个方法好让子类来覆写它.但是如果有更新的子子类来覆写时,我们又不想让其影响到上一层的覆写,这时候就要用到new virtual来 ...
- openstack云5天资料
在网上看到有个人的博客,写了个openstack云5天学习资料.对于英文不怎么好的童鞋来说,感觉还可以.可以对openstack有所了解和认识,对后续openstack更加深入的学习有很大的帮组. ...
- spring中的定时调度实现TimerFactoryBean引起的隐患
手中的一个老项目,其中使用的TimerFactoryBean实现的调度任务.一般都是spring quartz实现,这种的着实少见.正因为少见资料比较少,当初为了确认这个会不会2个调度任务同时并行执行 ...
- Spring远程调用技术<3>-Spring的HTTP Invoker
前面提到RMI使用java标准的对象序列化机制,但是很难穿透防火墙. 另一方面,Hessian和Burlap能很好地穿透防火墙,但是使用私有的对象序列化机制. Spring提供的http invke ...