当前位置:   article > 正文

Unity中CharacterController模拟力控制_charactercontroller 物理模拟

charactercontroller 物理模拟

在开发Unity游戏Demo的过程中,我遇到了一个具体需求:

当敌人与玩家发生碰撞时,玩家应该沿碰撞面法线方向受到一个推力。

通常情况下,Unity中的CharacterController组件无法直接实现这一效果,因此我探索了一种替代方法来模拟这种力的效应。


问题: 在Unity中如何在玩家与敌人发生碰撞时,垂直于接触面向玩家施加一个力?

解决方案: 可以通过碰撞信息中的Collision类的contacts数组获取法线,利用该法线与力的乘积通过Rigidbody.AddForce方法施加力。

实现代码示例:

  1. using UnityEngine;
  2. public class Controller : MonoBehaviour
  3. {
  4. public float damage = 10.0f;
  5. public float attackForce = 1000f;
  6. private void OnCollisionEnter(Collision collision)
  7. {
  8. Controller player = collision.gameObject.GetComponent<Controller>();
  9. if (player != null)
  10. {
  11. player.TakeDamage(damage);
  12. if (collision.contacts.Length > 0)
  13. {
  14. ContactPoint contact = collision.contacts[0];
  15. Vector3 normal = contact.normal;
  16. Rigidbody rb = player.GetComponent<Rigidbody>();
  17. if (rb != null)
  18. {
  19. rb.AddForce(normal * attackForce);//刚体
  20. }
  21. }
  22. }
  23. }
  24. }

问题:

CharacterController组件是独立于Unity物理引擎的,它处理移动和碰撞而不受标准物理规则的影响。为了在使用CharacterController时模拟物理效果,我们可以采用以下的代码结构。

模拟力代码:

  1. public class PlayerController : MonoBehaviour
  2. {
  3. private CharacterController controller;
  4. public float speed = 5.0f;
  5. public Vector3 impactForce;
  6. void Start()
  7. {
  8. controller = GetComponent<CharacterController>();
  9. }
  10. void Update()
  11. {
  12. if (impactForce.magnitude > 0.1f)
  13. {
  14. controller.Move(impactForce * Time.deltaTime);
  15. impactForce = Vector3.Lerp(impactForce, Vector3.zero, Time.deltaTime);
  16. }
  17. Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
  18. controller.Move(move * speed * Time.deltaTime);
  19. }
  20. public void AddImpact(Vector3 force)
  21. {
  22. impactForce += force;
  23. }
  24. }

此时, AddForceAddImpact 等效,可以在 CharacterController 中调用相关方法

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号