利用刚体组件实现物体移动、跳跃、冲刺
- 以下是关于 Unity 刚体组件与碰撞器组件的学习记录。
1. 实现效果
2. 刚体组件(Rigidbody)

- 概念:刚体组件是让物体产生物理行为的主要组件,挂载了刚体组件的物体将会受到重力的影响并且会在物理引擎的控制下运动。
- 常用属性:
- Mass:物体的质量,默认单位是千克。
- Drag:阻尼,可以理解为空气阻力。
- Use Gravity:勾选表示物体将受重力影响。
- Is Kinematic:勾选表示物体将不受物理引擎控制,即不再受到碰撞、力等物理因素的影响。Constraints:约束和限制物体在某些方向的移动和旋转。
- Freeze Position:冻结物体移动方向。
- Freeze Rotation:冻结物体旋转方向。
- 更多属性参考:【Rigidbody component reference - Unity 手册】
3. 实现物体移动
1. 新建物体和脚本,将脚本挂载到物体上。
2. 在物体上添加刚体组件。
3. 编辑脚本,添加如下代码。
public class CubeController : MonoBehaviour
{
private Rigidbody rb;
public float moveSpeed = 5f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(h, 0f, v).normalized * moveSpeed * Time.deltaTime;
rb.MovePosition(rb.position + movement);
}
}
- 此时测试将会发现物体会在场景中往下坠,是因为物体受到了重量的影响。
-
- 取消勾选Use Gravity属性。
-
- 添加碰撞器组件,但需要两个物体相互作用。
4. 碰撞器(Collider)
- Unity 中有多种碰撞器,比如盒型碰撞器(Box Collider)、球形碰撞器(Sphere Collider)、胶囊碰撞器(Capsule Collider)等。

- 概念:
- 碰撞器用于定义物体的形状和大小,以便在游戏引擎中进行碰撞检测。
- 当两个具有碰撞器的物体相遇时,Unity会根据这些碰撞器的形状和属性来判断它们是否发生碰撞,并触发相应的事件或行为。
- 属性:
- Edit Collider:编辑碰撞器。
- Is Trigger:勾选表示该碰撞体用于触发事件,并被物理引擎忽略。
- 更多属性参考:【Collision - Unity 手册】
- 在场景中创建一个地面并添加碰撞器,再给移动物体添加碰撞器。

- 再次运行,地面和立方体碰撞器相互作用。

5. 实现物体跳跃
- 实现物体跳跃需要给物体提供一个向上的力,可使用刚体提供的AddForce方法,当按下空格键时,对物体施加一个向上的力。
public float jumpForce = 5f;
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector.up * jumpForce,ForceMode.Impulse);
}
- 但此时我们测试会发现物体不仅在地面可以起跳,在空中也可以起跳,这显然不符合现实物理规律。所以需要添加一个地面检测,控制物体只能在地面时才可起跳。
public bool isGrounded = false;
isGrounded = Physics.Raycast(transform.position, Vector3.down, 0.5f);
if (Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
rb.AddForce(Vector.up * jumpForce,ForceMode.Impulse);
}
6. 实现物体冲刺
- 实现物体冲刺需要考虑物体常规移动与冲刺状态的转换,冲刺方向与移动方向一致。
-
- 物体正常移动和冲刺状态的转换,可通过检测键盘的输入来实现,当按住键盘左shift键时为冲刺状态,物体移动的速度会更新为冲刺速度。
-
- 冲刺方向与移动方向一致,可通过计算当前键盘的输入值来保持和移动方向一致。
public float dashSpeed = 20f;
Vector3 dashDirection = new Vector3(h, 0f, v).normalized;
if (Input.GetKey(KeyCode.LeftShift) && dashDirection != Vector3.zero)
{
rb.MovePosition(rb.position + dashDirection * dashSpeed * Time.deltaTime);
}
using UnityEngine;
public class CubeController : MonoBehaviour
{
private Rigidbody rb;
public float moveSpeed = 5f;
public float jumpForce = 5f;
public bool isGrounded = false;
public float dashSpeed = 20f;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 movement = new Vector3(h, 0f, v).normalized * moveSpeed * Time.deltaTime;
rb.MovePosition(rb.position + movement);
isGrounded = Physics.Raycast(transform.position, Vector3.down, 0.5f);
if (Input.GetKeyDown(KeyCode.Space)&& isGrounded)
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
Vector3 dashDirection = new Vector3(h, 0f, v).normalized;
if (Input.GetKey(KeyCode.LeftShift) && dashDirection != Vector3.zero)
{
rb.MovePosition(rb.position + dashDirection * dashSpeed * Time.deltaTime);
}
}
}
- 以上就是关于 Unity 刚体组件和碰撞器学习记录的全部内容,如有错误还请指正。