网站seo公司,交互网站开发培训,网站登录页做多大尺寸的,域名备案查询官网问题描述
游戏暂停的功能是通过设置timeScale0实现的#xff0c;不过在暂停游戏的时候#xff0c;需要对角色进行预览和设置#xff0c;为了实现这个功能#xff0c;是通过鼠标控制相机的操作#xff0c;为了使相机的操作丝滑#xff0c;获取鼠标操作系数乘以Time.delta…问题描述
游戏暂停的功能是通过设置timeScale0实现的不过在暂停游戏的时候需要对角色进行预览和设置为了实现这个功能是通过鼠标控制相机的操作为了使相机的操作丝滑获取鼠标操作系数乘以Time.deltaTime 了同时对数值进行了平滑操作Mathf.SmoothDamp和Mathf.SmoothDampAngle采用了具体代码可以参考https://blog.csdn.net/qq_33789001/article/details/120551521。 代码片段如下
//根据鼠标系数获取距离目标值
tdis - Input.GetAxis(Mouse ScrollWheel) * disMoveSpd * Time.deltaTime;
//平滑处理距离值
dis Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f);//根据鼠标系数获取旋转目标值
troty troty Input.GetAxis(Mouse X) * XSens * Time.deltaTime;
trotx trotx Input.GetAxis(Mouse Y) * YSens * Time.deltaTime;
//平滑处理旋转值
rotx Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f);
roty Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f);当游戏暂停后(timeScale0)Time.deltaTime的数值都变成0了。
解决办法
解决的思路就是在暂停时不用Time.deltaTime而是通过固定帧率计算出这个值。比如假设游戏是60帧那么数值就是1/60 0.0167f,这个数值是根据帧率越大而值越小的120帧就是0.008333。那么我就按60帧手动赋值0.0167f。代码修改如下
//根据鼠标系数获取距离目标值
tdis - Input.GetAxis(Mouse ScrollWheel) * disMoveSpd * 0.0167f;
//根据鼠标系数获取旋转目标值
troty troty Input.GetAxis(Mouse X) * XSens * 0.0167f;
trotx trotx Input.GetAxis(Mouse Y) * YSens * 0.0167f;这样能解决Time.deltaTime为0鼠标的操作都失效的问题。 然而运行后发现部分操作还是会失效而且操作过程中会出现这样的报错 is not valid. Input position is { NaN, NaN, NaN }. 经过研究发现 Mathf.SmoothDampAngle和Mathf.SmoothDamp两个函数与Time.deltaTime仍有关联他们的说明如下
它们都有deltaTime参数这个时间是上次调用这个函数的到这次调用的间隔时间默认为Time.deltaTime。因为之前调用这两个函数都没有进行这个传参默认是Time.deltaTime这种情况下为0。所以在这种情况下还需要传入maxSpeed和deltaTime参数。经过修改如下
//平滑处理距离值
dis Mathf.SmoothDamp(dis, tdis, ref zVel, 0.5f, 2, 0.0167f);//平滑处理旋转值
rotx Mathf.SmoothDampAngle(rotx, trotx, ref RxVel, 0.3f, 2, 0.0167f);
roty Mathf.SmoothDampAngle(roty, troty, ref RyVel, 0.3f, 2, 0.0167f);做了上述修改可以正常操作