Unity中鼠标点击地面控制人物移动

来源:互联网 发布:python手机版 编辑:程序博客网 时间:2024/04/28 15:49
  1. /// <summary>  
  2. /// 摄像机对象  
  3. /// </summary>  
  4. public Camera _camPlayer;  
  5. /// <summary>  
  6. /// 玩家的变换组件  
  7. /// </summary>  
  8. public Transform _transPlayer;  
  9. /// <summary>  
  10. /// 鼠标发出的射线  
  11. /// </summary>  
  12. private Ray _rayMouseMove;  
  13. /// <summary>  
  14. /// 射线起点与平面交点的距离  
  15. /// </summary>  
  16. private float _fDistMouseMove;  
  17. /// <summary>  
  18. /// 玩家所在的平面  
  19. /// </summary>  
  20. private Plane _planePlayer;  
  21. /// <summary>  
  22. /// 鼠标点击的三维坐标点  
  23. /// </summary>  
  24. private Vector3 _vec3Target;  
  25. /// <summary>  
  26. /// 鼠标点击的时间间隔  
  27. /// </summary>  
  28. private float _fTime = 0f;  
  29. /// <summary>  
  30. /// 玩家的角色控制器组件  
  31. /// </summary>  
  32. private CharacterController _playerControl;  
  33. /// <summary>  
  34. /// 玩家的动画组件  
  35. /// </summary>  
  36. private Animation _aniPlayer;  
  37. /// <summary>  
  38. /// 玩家的状态  
  39. /// </summary>  
  40. private int _playerStatus = 0;  
  41. private Vector3 _vec3;  
  42. //玩家的状态  
  43. private const int PLAYER_IDLE = 0;  
  44. private const int PLAYER_WALK = 1;  
  45. private const int PLAYER_RUN = 2;  
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1.   
[csharp] view plaincopy在CODE上查看代码片派生到我的代码片
  1. void Awake()  
  2. {  
  3.     _playerControl = (CharacterController)GameObject.FindObjectOfType(typeof(CharacterController));  
  4.     _aniPlayer = GameObject.FindGameObjectWithTag("Player").GetComponent<Animation>();  
  5.     _planePlayer = new Plane(_transPlayer.up, _transPlayer.position);  
  6.     _vec3Target = _transPlayer.position;  
  7.     //初始设置玩家的状态  
  8.     SetPlayerStatus(PLAYER_IDLE);  
  9. }  
  10.   
  11. void Update()  
  12. {  
  13.     if (Input.GetMouseButtonDown(0)) {  
  14.         //发射检测射线  
  15.         _rayMouseMove = _camPlayer.ScreenPointToRay(Input.mousePosition);  
  16.         //利用玩家平面,返回射线起点与平面交点的距离  
  17.         _planePlayer.Raycast(_rayMouseMove, out _fDistMouseMove);  
  18.         //根据距离获得鼠标点击的目标点三维坐标  
  19.         _vec3Target = _rayMouseMove.GetPoint(_fDistMouseMove);  
  20.         //玩家朝向目标点  
  21.         _transPlayer.LookAt(new Vector3(_vec3Target.x, _transPlayer.position.y, _vec3Target.z));  
  22.         //如果鼠标点击的时间间隔小于0.2秒,设定跑的状态  
  23.         if (Time.realtimeSinceStartup - _fTime <= 0.2f) {  
  24.             SetPlayerStatus(PLAYER_RUN);  
  25.         } else {//反之,设定走的状态  
  26.             SetPlayerStatus(PLAYER_WALK);  
  27.         }  
  28.         //保存鼠标点击时间  
  29.         _fTime = Time.realtimeSinceStartup;  
  30.     }  
  31. }  
  32.   
  33. void FixedUpdate()  
  34. {  
  35.     switch (_playerStatus) {  
  36.     case PLAYER_IDLE:  
  37.         //不移动  
  38.         break;  
  39.     case PLAYER_WALK:  
  40.         PlayerMove(0.05f);  
  41.         break;  
  42.     case PLAYER_RUN:  
  43.         PlayerMove(0.1f);  
  44.         break;  
  45.     default:  
  46.         break;  
  47.     }  
  48. }  
  49.   
  50. /// <summary>  
  51. /// 设置玩家状态的方法  
  52. /// </summary>  
  53. /// <param name="status">状态编号</param>  
  54. void SetPlayerStatus(int status)  
  55. {  
  56.     switch (status) {  
  57.     case PLAYER_IDLE:  
  58.         _aniPlayer.Play("idle");  
  59.         break;  
  60.     case PLAYER_WALK:  
  61.         _aniPlayer.Play("walk");  
  62.         break;  
  63.     case PLAYER_RUN:  
  64.         _aniPlayer.Play("run");  
  65.         break;  
  66.     default:  
  67.         break;  
  68.     }  
  69.   
  70.     _playerStatus = status;  
  71. }  
  72.   
  73. /// <summary>  
  74. /// 玩家移动的方法  
  75. /// </summary>  
  76. /// <param name="speed">移动速度</param>  
  77. void PlayerMove(float speed)  
  78. {  
  79.     if (Mathf.Abs(Vector3.Distance(_transPlayer.position, _vec3Target)) >= 0.1f) {  
  80.         _vec3 = Vector3.ClampMagnitude(_vec3Target - _transPlayer.position, speed);  
  81.         _playerControl.Move(_vec3);  
  82.     } else {  
  83.         SetPlayerStatus(PLAYER_IDLE);  
  84.     }  
  85. }  
0 0
原创粉丝点击