当前位置:   article > 正文

Unity3D控制人物移动跳跃,处理CharacterController的isGrounded总是返回false问题_unity isgrounded

unity isgrounded

Unity3D中控制人物移动的方法很多,可以使用transform.Translate方法,但为了不穿越其他物体,需要使用刚体rigidbody。还可以使用角色控制器,角色控制器是自带刚体Rigidbody和碰撞器Collider的,移动可以使用CharacterController组件。

在使用CharacterController组件实现跳跃时,需要检测人物是否在地面上,CharacterController提供了属性isGrounded以供检测,但是在使用中发现isGrounded总是返回false,个人认为CharacterController的SkinWidth要设置合理,官方推荐是radius的0.1大小,然后去监测或者使用isGrounded属性是在FixedUpdate里面而不是在Update里面,两者的结果会大不相同,这里替代使用射线检测方法来判断是否着地,射线检测其实就是用从人物身体发射一条向下的射线判断射线在给定距离内是否碰撞物体即可以判断是否着地。代码如下:

  1. public float speed = 1;
  2. public float jumpSpeed = 10;
  3. public float gravity = 20;
  4. public float margin = 0.1f;
  5. private Vector3 moveDirection = Vector3.zero;
  6. // 通过射线检测主角是否落在地面或者物体上
  7. bool IsGrounded() {
  8. return Physics.Raycast(transform.position, -Vector3.up, margin);
  9. }
  10. // Update is called once per frame
  11. void Update () {
  12. // 控制移动
  13. float h = Input.GetAxis ("Horizontal");
  14. float v = Input.GetAxis ("Vertical");
  15. if (IsGrounded()) {
  16. moveDirection = new Vector3 (h, 0, v);
  17. moveDirection = transform.TransformDirection (moveDirection);
  18. moveDirection *= speed;
  19. // 空格键控制跳跃
  20. if (Input.GetButton ("Jump")) {
  21. moveDirection.y = jumpSpeed;
  22. }
  23. }
  24. moveDirection.y -= gravity * Time.deltaTime;
  25. controller.Move (moveDirection * Time.deltaTime);
  26. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/118707
推荐阅读
相关标签
  

闽ICP备14008679号