NewBehaviourScript.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using UnityEngine;
  2. using System.Collections;
  3. public class NewBehaviourScript : MonoBehaviour
  4. {
  5. //摄像机参照的模型
  6. public Transform target;
  7. //摄像机距离模型的默认距离
  8. public float distance = 20.0f;
  9. //鼠标在x轴和y轴方向移动的速度
  10. float x;
  11. float y;
  12. //限制旋转角度的最小值与最大值
  13. float yMinLimit = -20.0f;
  14. float yMaxLimit = 80.0f;
  15. //鼠标在x和y轴方向移动的速度
  16. float xSpeed = 250.0f;
  17. float ySpeed = 120.0f;
  18. // Use this for initialization
  19. void Start()
  20. {
  21. //初始化x和y轴角度,使其等于参照模型的角度
  22. Vector2 Angles = transform.eulerAngles;
  23. x = Angles.y;
  24. y = Angles.x;
  25. if (gameObject.GetComponent<Rigidbody>() != null)
  26. {
  27. gameObject.GetComponent<Rigidbody>().freezeRotation = true;
  28. }
  29. //Debug.Log (this.transform == this.gameObject.transform);
  30. }
  31. void LateUpdate()
  32. {
  33. if (target)
  34. {
  35. //我的分析:1.根据垂直方向的增减量修改摄像机距离参照物的距离
  36. distance += Input.GetAxis("Vertical");
  37. //根据鼠标移动修改摄像机的角度
  38. x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
  39. y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
  40. //我的分析:2.这句相当于限制了摄像机在X轴方向上的视觉范围
  41. y = ClampAngle(y, yMinLimit, yMaxLimit);
  42. //我的分析:3.刚开始我还在纠结为什么将y作为X轴的旋转角度量,将x作为Y轴的角度旋转量。但仔细一想,这里的x和y分别就指的是鼠标水平方向和垂直方向的移动量,对应的不就刚好是y轴方向的转动与x轴方向的转动么,哈哈
  43. Quaternion rotation = Quaternion.Euler(y, x, 0);
  44. //我的分析:4.这一句就比较有意思了,后面详解
  45. Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
  46. Debug.Log(position.ToString());
  47. //设置摄像机的位置与旋转
  48. transform.rotation = rotation;
  49. transform.position = position;
  50. }
  51. }
  52. float ClampAngle(float angle, float min, float max)
  53. {
  54. //我的分析:5.这里之所以要加360,因为比如-380,与-20是等价的
  55. if (angle < -360)
  56. {
  57. angle += 360;
  58. }
  59. if (angle > 360)
  60. {
  61. angle -= 360;
  62. }
  63. return Mathf.Clamp(angle, min, max);
  64. }
  65. // Update is called once per frame
  66. void Update()
  67. {
  68. }
  69. }