1 移动刚体
在物理世界中,控制刚体移动通常有三种方式,每种方式产生的效果也不尽相同
-
AddForce:添加作用力,用于模拟真实的物理效果
-
MovePosition:设置位置,用于精确控制游戏对象的位置
-
velocity:设置速度,用于精确控制游戏对象的速度
游戏中期望玩家按下键盘或者拖动摇杆时,角色以恒定的速度移动,因此通过更改 velocity 的方式移动刚体
脚本的逻辑比较简单,在 FixedUpdate 中通过 Input 获取键盘的输入后,再乘以适当的系数计算出速度值,赋予刚体的 velocity 属性后,角色即可移动
为了体验更加舒适,角色移动的同时需要朝向移动的方向,可以使用 Quaternion.LookRotation(movement) 获得朝向的四元数,再通过 Quaternion.Slerp 实现平滑过度。如需了解四元数的更多信息,请参阅文档:「https://docs.unity3d.com/cn/2021.2/Manual/class-Quaternion.html」
物理引擎也采用与帧渲染类似的方式以离散时间步骤进行更新,在每次物理更新之前都会调用一个称为 FixedUpdate 的单独事件函数。由于物理更新和帧更新不会以相同频率进行,所以如果将物理代码放在 FixedUpdate 函数而不是 Update 中,此代码将产生更准确的结果。如需了解事件函数的更多信息,请参阅文档:「https://docs.unity3d.com/cn/2021.2/Manual/EventFunctions.html」
PlayerController 脚本如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 2.0f;
private Rigidbody _rigidbody;
void Start()
{
_rigidbody = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float inputX = Input.GetAxis("Horizontal");
float inputZ = Input.GetAxis("Vertical");
if (inputX == 0 && inputZ == 0)
{
return;
}
Vector3 movement = new Vector3(inputX, 0.0f, inputZ) * speed;
_rigidbody.velocity = new Vector3(movement.x, _rigidbody.velocity.y, movement.z);
if (movement != Vector3.zero)
{
transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(movement), 0.15f);
}
}
}
将脚本挂载到场景中的同名对象(PlayerController)上,点击运行
运行后会编辑器会自动切换到 Game 视图,但画面中存在两个问题:画面模糊以及角色在移动后摔倒了,这当然不是因为我们近视眼和小帅平地摔技能点满
成长不过就是一个不断发现问题、解决问题的过程
2 设置预览分辨率
编辑器中的 Aspect 可以选择不同值来测试游戏在具有不同宽高比的显示器上的显示效果。默认情况下,此设置为 Free Aspect
Aspect 下有个 Low Resolution Aspect Ratios 选项,启用该选项可模拟更旧显示屏的像素密度,选择宽高比后,此功能会降低 Game 视图的分辨率。Game 视图位于非 Retina 显示屏上时,此复选框始终处于启用状态
关闭该选项后,画面即可恢复正常
除了关闭该选项,还可以指定显示分辨率,通常设定为与市场主流设备分辨率相同比例的值,如 1624*750
3 禁止物理模拟旋转
Unity 的物理引擎会模拟真实世界的物理效果,包括重力和摩擦力等。如果角色在移动时遇到不平整的地面,可能会因为物理效果而出现旋转
Rigidbody 组件提供了 Freeze Rotation 属性,该属性控制物理引擎是否会更改对象的旋转状态。如果启用了 Freeze Rotation,则物理引擎不会修改旋转状态