unity中给刚体施加力的方法介绍
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种类型:
- ForceMode.Force(默认):施加一个持续的力,力的效果会随着时间累积
- ForceMode.Impulse:施加一个瞬间的冲量,力的效果会立即改变物体的速度
- ForceMode.Acceleration:施加一个持续的加速度,忽略物体的质量
- 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));
}
}
高级技巧
- 使用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);
}
}
- 使用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)!