当前位置:   article > 正文

Unity3D基础38:角色控制器组件_unity oncontrollercolliderhit

unity oncontrollercolliderhit

 

前文:https://blog.csdn.net/Jaihk662/article/details/87906156(Input控制面板)

一、CharacterController角色控制器

为什么使用角色控制器而不使用刚体?

 → 刚体过于灵活(敏感),例如稍有碰撞就会被弹开,物体的质量不好把握或计算等等

角色控制器面板与属性:

  • Slope Limit:控制角色最大的爬坡斜率
  • Step Offset:控制角色可以迈上最大的台阶高度
  • Skin Width:在角色的外围包裹着一层“皮肤”,这层皮肤的厚度,就相当于角色身上透明的衣服,如果Skin Width设置为1米,那么角色当然就会“浮空”1米,一般保持默认即可
  • Min Move Distance:最小移动距离,默认是1毫米,如果该数值过大但代码中单位移动速度很慢,角色就不会动
  • Center/Radius/Height:角色控制器组件在Scene面板中体现为一个“胶囊碰撞器”的形状,如下面第二张图,Center为胶囊中心点位置,Radius为半径,Height为高度

 

二、角色碰撞器与实例

OnControllerColliderHit(ControllerColliderHit hit):角色控制器自带有碰撞器,hit为角色碰撞器碰撞到的物体的信息,除此之外,如果拥有角色控制器组件,那么共存的其他的碰撞器组件就会处于“无效”状态

角色碰撞器的所有属性也都可以通过脚本获取,另一个控制角色移动脚本示例如下:

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class PlayerMove : MonoBehaviour
  5. {
  6. private Rigidbody myRigidbody;
  7. private Transform myTran;
  8. private CharacterController cont;
  9. public float moveSpeed = 12.0f;
  10. public float turnSpeed = 180.0f;
  11. private float myMoveAxis = 0.0f;
  12. private float myTurnAxis = 0.0f;
  13. void Start()
  14. {
  15. myRigidbody = gameObject.GetComponent<Rigidbody>();
  16. myTran = gameObject.GetComponent<Transform>();
  17. cont = gameObject.GetComponent<CharacterController>();
  18. cont.skinWidth = 0.02f; //初始化角色的皮肤厚度
  19. }
  20. void FixedUpdate()
  21. {
  22. myMoveAxis = Input.GetAxis("Vertical");
  23. myTurnAxis = Input.GetAxis("Horizontal");
  24. Move(myMoveAxis);
  25. Turn(myTurnAxis);
  26. }
  27. void Move(float myMoveAxis)
  28. {
  29. //Vector3 moveChange = myTran.forward * myMoveAxis * Time.deltaTime * moveSpeed;
  30. //myRigidbody.MovePosition(myTran.position + moveChange);
  31. if (myMoveAxis > 0) //角色前进
  32. cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis);
  33. else if (myMoveAxis < 0) //角色后退
  34. {
  35. //Quaternion turnChange = Quaternion.Euler(0f, 90f, 0f);
  36. //myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
  37. cont.Move(myTran.forward * Time.deltaTime * moveSpeed * myMoveAxis/2);
  38. }
  39. }
  40. void Turn(float myTurnAxis)
  41. {
  42. float Change = myTurnAxis * turnSpeed * Time.deltaTime;
  43. Quaternion turnChange = Quaternion.Euler(0f, Change, 0f);
  44. myRigidbody.MoveRotation(myRigidbody.rotation * turnChange);
  45. }
  46. void OnControllerColliderHit(ControllerColliderHit hit)
  47. {
  48. Debug.Log(hit.gameObject.name);
  49. }
  50. }

 

 

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

闽ICP备14008679号