当前位置:   article > 正文

CharacterController组件的基本使用_为什么需要使用character controller 组件,它能够给开发过程带来什么便利?

为什么需要使用character controller 组件,它能够给开发过程带来什么便利?

定义

CharacterController是一个基础的角色控制组件,通过它我们可以实现包括移动、奔跑、跳跃、爬楼梯和爬斜坡等基本的角色操作。它主要用于不基于刚体物理的第一人称或第三人称的角色控制。

注意事项

1.Move 方法是基于世界坐标系的,并且没有重力支持;

2.SimpleMove方法也是基于世界坐标系的,有重力支持(重力为游戏项目的全局重力值,在Editor-Project Settings-Physics-Gravity设置);

3.跳跃应该采用Move方法;

4.isGrounded与Skin Width和Min Move Distance参数有关。当你觉得isGrounded的判断不精确时可以尝试调节Skin Width和Min Move Distance参数。官方建议Skin Width保持为Radius参数的10%,而Min Move Distance为0;

5.对于穿透、卡住、碰撞抖动等问题可以通过适当增大Skin Width的方式来解决;

6.使用该组件后无法通过Transform组件直接修改坐标、旋转等变换值,需要先禁用该组件,修改完成后再重新启用。

总结自官方英文文档

脚本示例

  1. using UnityEngine;
  2. [RequireComponent(typeof(CharacterController))]
  3. public class Player : MonoBehaviour
  4. {
  5. [Header("必要属性")]
  6. [Tooltip("角色转向速度")] public float TurnSpeed = 100;
  7. [Tooltip("角色移动速度")] public float MoveSpeed = 13;
  8. [Tooltip("角色跳跃高度")] public float JumpHeight = 2.5f;
  9. [Tooltip("重力加速度值")] public float GravityValue = -9.81f;
  10. private CharacterController cc;
  11. private Vector3 playerVelocity;
  12. private void Start()
  13. {
  14. cc = GetComponent<CharacterController>();
  15. }
  16. private void Update()
  17. {
  18. Movement();
  19. Jump();
  20. }
  21. // 角色转向
  22. private void Turn(float hor)
  23. {
  24. Vector3 euler = transform.localRotation.eulerAngles;
  25. float yRotation = euler.y + hor * TurnSpeed * Time.deltaTime;
  26. transform.localRotation = Quaternion.Euler(euler.x, yRotation, euler.z);
  27. }
  28. // 基于CharacterController的Move方法
  29. // private void Movement()
  30. // {
  31. // float hor = Input.GetAxisRaw("Horizontal");
  32. // float ver = Input.GetAxisRaw("Vertical");
  33. // if (hor != 0) Turn(hor);
  34. // Vector3 direction = transform.TransformDirection(Vector3.forward * ver);
  35. // cc.Move(direction * Time.deltaTime * MoveSpeed);
  36. // }
  37. // 基于CharacterController的SimpleMove方法
  38. private void Movement()
  39. {
  40. float hor = Input.GetAxisRaw("Horizontal");
  41. float ver = Input.GetAxisRaw("Vertical");
  42. if (hor != 0) Turn(hor);
  43. Vector3 direction = transform.TransformDirection(Vector3.forward * ver);
  44. cc.SimpleMove(direction * MoveSpeed);
  45. }
  46. // 角色跳跃
  47. private void Jump()
  48. {
  49. if (cc.isGrounded)
  50. {
  51. if (playerVelocity.y < 0) playerVelocity.y = 0;
  52. if (Input.GetButtonDown("Jump"))
  53. {
  54. playerVelocity.y += Mathf.Sqrt(JumpHeight * -3.0f * GravityValue);
  55. }
  56. }
  57. playerVelocity.y += GravityValue * Time.deltaTime;
  58. cc.Move(playerVelocity * Time.deltaTime);
  59. }
  60. }

相关文章

【Demo】基于CharacterController组件的角色控制

如果这篇文章对你有帮助,请给作者点个赞吧!

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

闽ICP备14008679号