网上查了不少关于球体滚动的教程,发现大部分都是直接对球体来一个Rigidbody.AddForce() 来解决:
void GiveForce()//跟随相机朝向
{
var force = (Input.GetKey(KeyCode.LeftShift) ? sliteForce * 2 : sliteForce);
rb.AddForce(force * verticalInput * Camera.transform.forward);
rb.AddForce(force * horizontalInput * Camera.transform.right);
}
这种方式只是单纯给物体中心施加一个力而已,球体本身是被“念力”推动,而非自发的滚动。虽然看起来球体是滚动了,但这是因为球面和地面的相对摩擦而导致的,这种运动方式缺乏真实性,且会丧失很多有趣的物理特性,如像汽车轮胎漂移和抓地感等。
更好的解决方案是让球体有自己滚动的扭矩,由球体和接触面之间的接触面摩擦力驱动。这种方式可以使球像现实生活中的汽车轮胎一样滚动,有它的扭力和抓地力,这让球的运动更加真实和顺滑。它还可以具有滑行的性质,并在一定程度上改善游戏体验。
Unity提供了一个可以改变物体扭矩的API,叫做Rigidbody.AddTorque(Vector3, ForceMode ):
Unity - Scripting API: Rigidbody.AddTorque (unity3d.com)https://docs.unity3d.com/ScriptReference/Rigidbody.AddTorque.htmlVector3 torque 围绕中心的方向,这里将被设置为摄像机的方向,所以球的旋转将跟随摄像机的变化。改变球的刚体最大角速度(float MaxangularVelocity)可以使球在玩家输入加速指令时在两个最大速度和扭矩之间切换。将一下代码附在球体上,记得添加Rigibody和相机。
//部分核心代码逻辑
Rigidbody rb; // player
public bool towardWithCamera = true;//可选是否根据相机方向旋转
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
TurningTorque();
}
void Update()
{//键盘ASDW
horizontalInput = Input.GetAxis("Horizontal");//AD
verticalInput = Input.GetAxis("Vertical");//WS
}
void TurningTorque()
{
rb.maxAngularVelocity = (Input.GetKey(KeyCode.LeftShift) ? speedUp_torque : initial_torque);
if (towardWithCamera)
{
rb.AddTorque(rb.maxAngularVelocity * verticalInput * Camera.transform.right); //foward and back, rotate around Camera's red axis
rb.AddTorque(rb.maxAngularVelocity * horizontalInput * -Camera.transform.forward); //left and right,rotate around Camera's blue axis
}
else
{
rb.AddTorque(rb.maxAngularVelocity * verticalInput * Vector3.right);
rb.AddTorque(rb.maxAngularVelocity * horizontalInput * -Vector3.forward);
}
}
和物理受力有关代码应该在FixedUpdate里面,而不是在Update函数里面。所有的物理行为和物理更新都是在FixedUpdate之后立即发生的,因为FixedUpdate是以固定时间间隔调用的,且执行顺序早于Update,与帧速率无关,但按键检测还是放在Update中相应更及时[Unity - Scripting API: MonoBehaviour.FixedUpdate() (unity3d.com),The Difference Between Update And FixedUpdate In Unity – Game Dev Planet].
此外,如果还在为相机跟随和转动而抓狂,可以直接使用Unity 的Cinemachine (unity.com)直接飞起!!!
有问题和更好的建议欢迎留言,评论~