1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using UnityEngine;
- using System.Collections;
- public class NewBehaviourScript : MonoBehaviour
- {
- //摄像机参照的模型
- public Transform target;
- //摄像机距离模型的默认距离
- public float distance = 20.0f;
- //鼠标在x轴和y轴方向移动的速度
- float x;
- float y;
- //限制旋转角度的最小值与最大值
- float yMinLimit = -20.0f;
- float yMaxLimit = 80.0f;
- //鼠标在x和y轴方向移动的速度
- float xSpeed = 250.0f;
- float ySpeed = 120.0f;
- // Use this for initialization
- void Start()
- {
- //初始化x和y轴角度,使其等于参照模型的角度
- Vector2 Angles = transform.eulerAngles;
- x = Angles.y;
- y = Angles.x;
- if (gameObject.GetComponent<Rigidbody>() != null)
- {
- gameObject.GetComponent<Rigidbody>().freezeRotation = true;
- }
- //Debug.Log (this.transform == this.gameObject.transform);
- }
- void LateUpdate()
- {
- if (target)
- {
- //我的分析:1.根据垂直方向的增减量修改摄像机距离参照物的距离
- distance += Input.GetAxis("Vertical");
- //根据鼠标移动修改摄像机的角度
- x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
- y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
- //我的分析:2.这句相当于限制了摄像机在X轴方向上的视觉范围
- y = ClampAngle(y, yMinLimit, yMaxLimit);
- //我的分析:3.刚开始我还在纠结为什么将y作为X轴的旋转角度量,将x作为Y轴的角度旋转量。但仔细一想,这里的x和y分别就指的是鼠标水平方向和垂直方向的移动量,对应的不就刚好是y轴方向的转动与x轴方向的转动么,哈哈
- Quaternion rotation = Quaternion.Euler(y, x, 0);
- //我的分析:4.这一句就比较有意思了,后面详解
- Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance) + target.position;
- Debug.Log(position.ToString());
- //设置摄像机的位置与旋转
- transform.rotation = rotation;
- transform.position = position;
- }
- }
- float ClampAngle(float angle, float min, float max)
- {
- //我的分析:5.这里之所以要加360,因为比如-380,与-20是等价的
- if (angle < -360)
- {
- angle += 360;
- }
- if (angle > 360)
- {
- angle -= 360;
- }
- return Mathf.Clamp(angle, min, max);
- }
- // Update is called once per frame
- void Update()
- {
- }
- }
|