当前位置:   article > 正文

unity相机运动并在撞到碰撞后停止往运动的那个方向运动_unity取消物体碰撞改变速度方向

unity取消物体碰撞改变速度方向

一个简单的测试,wasd可以控制相机运动,右键可以控制旋转角度,当相机移动到距离碰撞距离超过所设定的距离时,停止往移动的方向移动,主要利用射线检测距离的功能。

  1. using UnityEngine;
  2. using System.Collections;
  3. public class FlyCamera : MonoBehaviour {
  4. public float _mFSpeed = 250f;
  5. public float _mMaxSpeed = 500.0f;
  6. public float _mMinSpeed = 0.1f;
  7. /// <summary>
  8. /// 旋转轴向控制
  9. /// </summary>
  10. public enum RotateAxes {
  11. MouseXAndY=0,
  12. MouseX=1,
  13. MouseY=2
  14. }
  15. /// <summary>
  16. /// 实际使用的旋转轴向
  17. /// </summary>
  18. public RotateAxes _mRotateAxes = RotateAxes.MouseXAndY;
  19. /// <summary>
  20. /// X轴向分量
  21. /// </summary>
  22. public float _mFsensitivityX = 12.0f;
  23. /// <summary>
  24. /// Y轴向分量
  25. /// </summary>
  26. public float _mFSensitivityY = 12.0f;
  27. /// <summary>
  28. /// X轴向最小旋转角度
  29. /// </summary>
  30. public float _mFminiX = -360.0f;
  31. /// <summary>
  32. /// X轴向最大旋转角度
  33. /// </summary>
  34. public float _mFmaxX = 360.0f;
  35. /// <summary>
  36. /// Y轴最小旋转角度
  37. /// </summary>
  38. public float _mFminiY = -60.0f;
  39. /// <summary>
  40. /// Y轴最大旋转速度
  41. /// </summary>
  42. public float _mFmaxY = 60.0f;
  43. /// <summary>
  44. /// Y轴向旋转
  45. /// </summary>
  46. float _mFrotateY = 0.0f;
  47. public float _mLimitHeight=1.2f;
  48. public bool _mCanLimitHeight=false;
  49. public float _mPadRotAngle = 8.0f;
  50. public enum RotateMode{
  51. RotateByMoveMouse=0,
  52. RotateByRightMouseButton=1
  53. }
  54. public RotateMode _mRotMode=RotateMode.RotateByRightMouseButton;
  55. private Vector2 _mFirstVec = Vector2.zero, _mSceondVec = Vector2.zero;
  56. void Awake() {
  57. _mCanLimitHeight = false;
  58. _mFirstVec=Vector2.zero;
  59. _mSceondVec=Vector2.zero;
  60. Hide("UI");
  61. }
  62. void FixedUpdate () {
  63. if(Input.GetKey(KeyCode.Delete)){
  64. if(Input.GetKeyDown(KeyCode.B)){
  65. _mCanLimitHeight = !_mCanLimitHeight;
  66. }
  67. }
  68. if(_mCanLimitHeight){
  69. transform.localPosition=new Vector3 (transform.localPosition.x,_mLimitHeight,transform.localPosition.z);
  70. }
  71. }
  72. void Update () {
  73. _MoveCamera();
  74. if(_mRotMode==RotateMode.RotateByMoveMouse){
  75. _RotateCamera(0);
  76. }else{
  77. _RotateCamera(1);
  78. }
  79. _ModifySpeed();
  80. }
  81. void _ModifySpeed() {
  82. if (Input.GetKeyDown(KeyCode.KeypadPlus)) {
  83. _mFSpeed+=0.1f;
  84. if (_mFSpeed >= _mMaxSpeed) _mFSpeed = _mMaxSpeed;
  85. //print(_mFSpeed);
  86. }
  87. if (Input.GetKeyDown(KeyCode.KeypadMinus)) {
  88. _mFSpeed -= 0.1f;
  89. if (_mFSpeed <= _mMinSpeed) _mFSpeed = _mMinSpeed;
  90. //print(_mFSpeed);
  91. }
  92. }
  93. void _MoveCamera() {
  94. if (Input.GetKey(KeyCode.W) && CanMove(transform.forward)) transform.Translate(Vector3.forward * Time.deltaTime * _mFSpeed);
  95. if (Input.GetKey(KeyCode.S) && CanMove(-transform.forward)) transform.Translate(Vector3.back * Time.deltaTime * _mFSpeed);
  96. if (Input.GetKey(KeyCode.A) && CanMove(-transform.right)) transform.Translate(Vector3.left * Time.deltaTime * _mFSpeed);
  97. if (Input.GetKey(KeyCode.D) && CanMove(transform.right)) transform.Translate(Vector3.right * Time.deltaTime * _mFSpeed);
  98. if (Input.GetKey(KeyCode.Q) && CanMove(transform.up)) transform.Translate(Vector3.up * Time.deltaTime * _mFSpeed);
  99. if (Input.GetKey(KeyCode.E) && CanMove(-transform.up)) transform.Translate(Vector3.down * Time.deltaTime * _mFSpeed);
  100. }
  101. void _RotateCamera(int m_MouseKeycodeNumber) {
  102. if(Input.GetMouseButton(m_MouseKeycodeNumber)){
  103. if (_mRotateAxes == RotateAxes.MouseXAndY) {
  104. float rotateX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * _mFsensitivityX;
  105. _mFrotateY += Input.GetAxis("Mouse Y") * _mFSensitivityY;
  106. _mFrotateY = Mathf.Clamp(_mFrotateY, _mFminiY, _mFmaxY);
  107. transform.localEulerAngles = new Vector3(-_mFrotateY, rotateX,0);
  108. //Debug.Log("MouseXY");
  109. }else if(_mRotateAxes==RotateAxes.MouseX){
  110. transform.Rotate(0, Input.GetAxis("Mouse X") * _mFsensitivityX, 0);
  111. //Debug.Log("MouseX");
  112. }else{
  113. _mFrotateY += Input.GetAxis("Mouse Y") * _mFSensitivityY;
  114. _mFrotateY = Mathf.Clamp(_mFrotateY, _mFminiY, _mFmaxY);
  115. transform.localEulerAngles = new Vector3(-_mFrotateY, transform.localEulerAngles.y, 0);
  116. //Debug.Log("MouseY");
  117. }
  118. }
  119. }
  120. private void Hide(string someLayer)
  121. {
  122. GetComponent<Camera>().cullingMask &= ~(1 << LayerMask.NameToLayer(someLayer));
  123. }
  124. private RaycastHit _hit;
  125. public float rayLength = 0.5f;
  126. /// <summary>
  127. /// 相机距离检测与设定距离对比并返回是否运动的判断
  128. /// </summary>
  129. /// <param name="dir">本物体所朝的方向</param>
  130. /// <returns></returns>
  131. bool CanMove(Vector3 dir)
  132. {
  133. Ray ray = new Ray(transform.position, dir);
  134. //if (Physics.Raycast(ray, out _hit, RayLength, 1 << LayerMask.NameToLayer("wall")))
  135. if (Physics.Raycast(ray, out _hit, rayLength))
  136. {
  137. //print(_hit.transform.name);
  138. return false;
  139. }
  140. return true;
  141. }
  142. }

工程的下载地址链接:链接: https://pan.baidu.com/s/1nhjrJ6eKB68oUfINPGcwQQ 密码: kd8r 。

unity版本:Unity 2017.3.1p4

大家有好的想法,可以写一下

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

闽ICP备14008679号