自学内容网 自学内容网

unity中给刚体施加力的方法介绍

在unity中,通过刚体(Rigidbody)组件可对游戏对象施加力,使其移动、旋转或受到物理效果的影响

AddForce

可用于给刚体施加力,使其产生运动或改变运动状态,AddForce方法有多个重载,可以根据不同的需求选择合适的重载方法

1. 基本用法

public void AddForce(Vector3 force, ForceMode mode = ForceMode.Forece);
  • force:施加的力的矢量
  • mode:力的模式,默认为ForceMode.Force
public class AddForceExample : MonoBehaviour
{
    public Rigidbody rb;
    public Vector3 forceDirection = new Vector3(0,0,10f); //向前施加力
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //每帧施加力
        rb.AddForce(forceDirection);
    }
}
  • 在FixedUpdate方法中每帧给刚体施加一个向前的力,使其向前移动

2. ForceMode参数

AddForce方法的第二个参数ForceMode指定了力的模式,ForceMode有4种类型:

  1. ForceMode.Force(默认):施加一个持续的力,力的效果会随着时间累积
  2. ForceMode.Impulse:施加一个瞬间的冲量,力的效果会立即改变物体的速度
  3. ForceMode.Acceleration:施加一个持续的加速度,忽略物体的质量
  4. ForceMode.VelocityChange:施加一个瞬间的速度变化,忽略物体的质量和时间
public class ForceModeExample : MonoBehaviour
{
    public Rigidbody rb;
    public Vector3 forceDirection = new Vertor3(0,0,10f); //向前施加力
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //使用Force模式
        rb.AddForce(forceDirection, ForceMode.Force);
        
        //使用Impulse模式
        //rb.AddForce(forceDirection, ForceMode.Impulse);
        
        //使用Acceleration模式
        //rb.AddForce(forceDirection, ForceMode.Acceleration);
        
        //使用VelocityChange模式
        // rb.AddForce(forceDirection, ForceMode.VelocityChange);
    }
}

3. AddForce与其他方法结合使用

示例:

public class CombinedForceExample : MonoBehaviour
{
    public Rigidbody rb;
    public Vector3 forceDirection = new Vector3(0, 0, 10f); //向前施加力
    public Vector3 torqueDirection = new Vector3(0, 10f, 0); //绕Y轴旋转
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //同时施加力和扭矩
        rb.AddForce(forceDirection);
        rb.AddTorque(torqueDirection);
    }
}

AddRelativeForce(局部坐标施加力)

AddRelativeForce方法类似于AddForce,但它是在刚体的局部坐标系中施加力

public void AddRelativeForce(Vector3 force, ForceMode mode = ForceMode.Force);
  • Force: 施加的力,类型为Vector3,力的方向和大小由Vector3表示
  • Mode: (可选)施加力的模式,类型为ForceMode,默认值为ForceMode.Force
public class AddRelativeForceExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //施加一个相对于刚体局部坐标系向前的力
        rb.AddRelativeForce(Vector3.forward * 10f);
    }
}

AddFoceAtPosition(模拟冲击力)

用于在刚体的特定位置施加一个力,用于模拟冲击力或爆炸效果

public void AddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);
  • force:施加的力,类型Vector3,力的方向和大小由Vector3表示
  • position:施加力的位置,类型为Vector3
  • mode:(可选)施加力的模式,类型为ForceMode,默认值为ForceMode.Force
public class AddForceAtPositionExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //在刚体的顶部施加一个向上的力
        rb.AddForceAtPosition(Vector3.up * 10f, transform.position + Vector3.up);
    }
}

AddExplosionForce(模拟爆炸力)

addExplosionForce方法用来模拟爆炸效果,在刚体上施加一个以爆炸点为中心的力

public void AddExplosionForce(float explosionForce, Vector3 explosionPosition, float explosionRadius, float upwardsModifier = 0.0f, ForceMode mode = ForceMode.Force);
  • explosionForce:爆炸力的大小,类型为float
  • explosionPosition:爆炸点的位置
  • explosionRadius:爆炸的影响范围
  • upwardsModifier:(可选)向上修正值,用于模拟爆炸的向上推力
  • mode:(可选)施加力的模式,默认为ForceMode.Force
public class AddExplosionForceExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //施加一个爆炸力
        rb.AddExplosionForce(1000f, transform.position, 5f, 1f);
    }
}

AddTorque(施加扭矩)

用于在刚体上施加扭矩(旋转力)

public void AddTorque(Vetor3 torque, ForceMode mode = ForceMode.Force);
  • torque:施加的扭矩,类型为vector3,扭矩的方向和大小由vector3表示
public class AddTorqueExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    voide FixedUpdate()
    {
        //施加一个绕Y轴的扭矩
        rb.AddTorque(Vector3.up * 10f);
    }
}

AddRelativeTorque

类似AddTorque,但它是在刚体的局部坐标系中施加扭矩

Public void AddRelativeTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
  • torque:施加的扭矩,类型为Vector3
public class AddRelativeTorqueExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //施加一个绕刚体局部坐标系Y轴的扭矩
        rb.AddRelativeTorque(Vector3.up * 10f);
    }
}

MovePosition

用于直接移动刚体到指定的位置,这个方法会立即更新刚体的位置,而不需要通过施加力实现

public void MovePosition(Vector3 position);
  • position:目标位置,类型为Vector3
public class MovePositionExample : MonoBehaviour
{
    public Rigidbody rb;
    
    voide Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //直接将刚体移动到指定位置
        rb.MovePosition(transform.position + Vector3.forward * 1f);
    }
}

MoveRotation

用于直接旋转刚体到指定的旋转角度,这个方法会立即更新刚体的旋转,而不需要通过施加扭矩来实现

public void MoveRotation(Quaternion rot);
  • rot:目标旋转角度,类型为Quaternion
public class MoveRotationExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void FixedUpdate()
    {
        //直接将刚体旋转到指定角度
        rb.MoveRotation(Quaternion.Euler(0, 45, 0));
    }
}

高级技巧

  1. 使用onCollisionEnter和OnTriggerEnter,在碰撞时间中施加力可以实现一些特殊效果,比如反弹,推动等
public class CollisionForceExample : MonoBehaviour
{
    public Rigidbody rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }
    
    void OnCollisionEnter(Collision collision)
    {
        //碰撞时施加一个向上的力
        rb.AddForce(Vector3.up * 100f, ForceMode.Impulse);
    }
    
    void OnTriggerEnter(Collider other)
    {
        //触发器进入时施加一个向前的力
        rb.AddForce(Vector3.forward * 100f, ForceMode.Impulse);
    }
}
  1. 使用MovePosition和MoveRotation可以结合插值(Lerp)来实现平滑移动和旋转
public class SmoothMoveExample : MonoBehaviour
{
    public Rigidbody rb;
    public Vector3 targetPosition;
    public Quaternion targetRotation;
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        targetPosition = transform.position + Vector3.forward * 10f;
        targetRotation = Quaternion.Euler(0, 90, 0);
    }
    
    void FixedUpdate()
    {
        //插值移动
        rb.MovePosition(Vector3.Lerp(rb.position, targetPosition, Time.fixedDeltaTime));
        
        //插值旋转
        rb.MoveRotation(Quaternion.Lerp(rb.rotation, targetRotation, Time.fixedDeltaTime));
    }
}

原文地址:https://blog.csdn.net/weixin_42333247/article/details/144041642

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!