【Unity】利用刚体组件实现物体移动、跳跃、冲刺

利用刚体组件实现物体移动、跳跃、冲刺

  • 以下是关于 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;
        //利用刚体组件的MovePosition方法更新物体位置(物体当前位置+键盘输入数值)
		rb.MovePosition(rb.position + movement);
    }
}
  • 此时测试将会发现物体会在场景中往下坠,是因为物体受到了重量的影响。
      1. 取消勾选Use Gravity属性。
      1. 添加碰撞器组件,但需要两个物体相互作用。
4. 碰撞器(Collider)
  • Unity 中有多种碰撞器,比如盒型碰撞器(Box Collider)、球形碰撞器(Sphere Collider)、胶囊碰撞器(Capsule Collider)等。
  • 在这里插入图片描述
  • 概念:
    • 碰撞器用于定义物体的形状和大小,以便在游戏引擎中进行碰撞检测。
    • 当两个具有碰撞器的物体相遇时,Unity会根据这些碰撞器的形状和属性来判断它们是否发生碰撞,并触发相应的事件或行为。
  • 属性:
    • Edit Collider:编辑碰撞器。
    • Is Trigger:勾选表示该碰撞体用于触发事件,并被物理引擎忽略。
  • 更多属性参考:【Collision - Unity 手册】
  • 在场景中创建一个地面并添加碰撞器,再给移动物体添加碰撞器。
  • 在这里插入图片描述
  • 再次运行,地面和立方体碰撞器相互作用。
  • 在这里插入图片描述
5. 实现物体跳跃
  • 实现物体跳跃需要给物体提供一个向上的力,可使用刚体提供的AddForce方法,当按下空格键时,对物体施加一个向上的力。
public float jumpForce = 5f; // 声明物体跳跃的力度
// 在Update方法内添加以下代码
if (Input.GetKeyDown(KeyCode.Space)) // 按下空格键时,物体跳跃
{
    rb.AddForce(Vector.up * jumpForce,ForceMode.Impulse);
}
  • 但此时我们测试会发现物体不仅在地面可以起跳,在空中也可以起跳,这显然不符合现实物理规律。所以需要添加一个地面检测,控制物体只能在地面时才可起跳。
public bool isGrounded = false; // 物体是否在地面上
// 在Update方法内添加以下代码
// 利用射线检测是否在地面上,从物体位置向下发射一条0.5个单位的射线,如果在该长度内射线发生了碰撞则说明物体正处于地面上
isGrounded = Physics.Raycast(transform.position, Vector3.down, 0.5f); 
if (Input.GetKeyDown(KeyCode.Space) && isGrounded) // 按下空格且物体在地面上时,执行跳跃。
{
    rb.AddForce(Vector.up * jumpForce,ForceMode.Impulse);
}
6. 实现物体冲刺
  • 实现物体冲刺需要考虑物体常规移动与冲刺状态的转换,冲刺方向与移动方向一致。
      1. 物体正常移动和冲刺状态的转换,可通过检测键盘的输入来实现,当按住键盘左shift键时为冲刺状态,物体移动的速度会更新为冲刺速度。
      1. 冲刺方向与移动方向一致,可通过计算当前键盘的输入值来保持和移动方向一致。
public float dashSpeed = 20f; // 定义物体冲刺速度

// 在Update方法内添加以下代码
Vector3 dashDirection = new Vector3(h, 0f, v).normalized; // 计算冲刺方向
// 按下左Shift键且方向向量值不为0时,物体冲刺
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 刚体组件和碰撞器学习记录的全部内容,如有错误还请指正。
Unity3D中,刚体物体移动和转向通常通过脚本控制。以下是一个简单的C#脚本示例,展示如何实现刚体物体移动和转向: ```csharp using UnityEngine; public class RigidbodyMovement : MonoBehaviour { // 刚体组件 private Rigidbody rb; // 移动速度 public float moveSpeed = 5f; // 转向速度 public float turnSpeed = 720f; void Start() { // 获取刚体组件 rb = GetComponent<Rigidbody>(); } void FixedUpdate() { // 获取输入 float move = Input.GetAxis("Vertical"); float turn = Input.GetAxis("Horizontal"); // 计算移动向量 Vector3 movement = transform.forward * move * moveSpeed * Time.fixedDeltaTime; // 应用移动 rb.MovePosition(rb.position + movement); // 计算转向角度 float turnAngle = turn * turnSpeed * Time.fixedDeltaTime; // 应用转向 Quaternion turnRotation = Quaternion.Euler(0f, turnAngle, 0f); rb.MoveRotation(rb.rotation * turnRotation); } } ``` 这个脚本实现了以下功能: 1. **获取刚体组件**:在`Start()`方法中,通过`GetComponent<Rigidbody>()`获取刚体组件。 2. **获取输入**:在`FixedUpdate()`方法中,通过`Input.GetAxis("Vertical")`和`Input.GetAxis("Horizontal")`获取玩家的输入。 3. **计算移动向量**:根据玩家的输入和设定的移动速度,计算出移动向量。 4. **应用移动**:使用`rb.MovePosition()`方法将刚体移动到新的位置。 5. **计算转向角度**:根据玩家的输入和设定的转向速度,计算出转向角度。 6. **应用转向**:使用`rb.MoveRotation()`方法将刚体旋转到新的方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值