第一种, 按住鼠标的右键进行移动视角,同时滚轮调正视角大小。
public Transform target; //相机追随目标 public float xSpeed = 200; //X轴方向拖动速度 public float ySpeed = 200; //Y轴方向拖动速度 public float mSpeed = 10; //放大缩小速度 public float yMinLimit = -50; //在Y轴最小移动范围 public float yMaxLimit = 50; //在Y轴最大移动范围 public float distance = 10; //相机视角距离 public float minDinstance = 2; //相机视角最小距离 public float maxDinstance = 30; //相机视角最大距离 public float x = 0.0f; public float y = 0.0f; public float damping = 5.0f; public bool needDamping = true; void Start() { Vector3 angle = transform.eulerAngles; x = angle.y; y = angle.x; } void LateUpdate() //处理相机部分 { if (target) { if (Input.GetMouseButton(1)) { x += Input.GetAxis("Mouse X") * xSpeed * 0.02f; y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f; y = ClamAngle(y, yMinLimit, yMaxLimit); } distance -= Input.GetAxis("Mouse ScrollWheel") * mSpeed; distance = Mathf.Clamp(distance, minDinstance, maxDinstance); Quaternion rotation = Quaternion.Euler(y, x, 0.0f); Vector3 disVector = new Vector3(0.0f, 0.0f, -distance); Vector3 position = rotation * disVector + target.position; if (needDamping) { transform.rotation = Quaternion.Lerp(transform.rotation, rotation, Time.deltaTime * damping); transform.position = Vector3.Lerp(transform.position, position, Time.deltaTime * damping); } else { transform.rotation = rotation; transform.position = position; } } } static float ClamAngle(float angle, float min, float max) { if (angle < -360) { angle += 360; } if (angle > 360) { angle -= 360; } return Mathf.Clamp(angle, min, max); }
效果:
第二种, 不用按住鼠标即可移动相机视角,但不能用滚轮调整视角大小(代码一般,不建议用)
public GameObject cube;//获取角色,不推荐这个做法,建议测试使用 Quaternion camaeraXAngle;//获取鼠标X轴偏移量当摄像机旋转角度 Quaternion camaeraYAngle;//获取鼠标Y轴偏移量当摄像机旋转角度 void LateUpdate() { if (Input.GetAxis("Mouse X") > 0.2)//当鼠标X轴偏移量大于0.3时执行,鼠标偏移量过小不执行(玩家也许只是想上下旋转摄像机但是难免会造成X轴偏移,所以当X轴偏移过小时不执行) { camaeraXAngle = Quaternion.Slerp(camaeraXAngle, Quaternion.Euler(0, Input.GetAxis("Mouse X"), 0), 0.1f); //平滑设置旋转角度 transform.rotation *= camaeraXAngle;//旋转 } else if (Input.GetAxis("Mouse X") < -0.2) { camaeraXAngle = Quaternion.Slerp(camaeraXAngle, Quaternion.Euler(0, Input.GetAxis("Mouse X"), 0), 0.1f); transform.rotation *= camaeraXAngle; } if (Input.GetAxis("Mouse Y") < -0.2 && this.transform.rotation.x > 0.15) { camaeraYAngle = Quaternion.Slerp(camaeraYAngle, Quaternion.Euler(Input.GetAxis("Mouse Y"), 0, 0), 0.1f); transform.rotation *= camaeraYAngle; } else if (Input.GetAxis("Mouse Y") > 0.2 && this.transform.rotation.x < 0.5) { camaeraYAngle = Quaternion.Slerp(camaeraYAngle, Quaternion.Euler(Input.GetAxis("Mouse Y"), 0, 0), 0.1f); transform.rotation *= camaeraYAngle; } this.transform.position = (this.transform.rotation * new Vector3(0, 0, -5) + cube.transform.position);//摄像机的位置设置 this.transform.LookAt(cube.transform);//摄像机看向角色 }
效果:
第三种, 不用鼠标控制移动视角,但可以用滚轮控制视角大小,同时当人物移动时相机会丝滑的移动到角色背后(推荐)
public Transform target; public float distanceUp = 10f;//相机与目标的竖直高度参数 public float distanceAway = 10f;//相机与目标的水平距离参数 public float smooth = 2f;//位置平滑移动插值参数值 public float camDepthSmooth = 20f; void Update() { // 鼠标轴控制相机的远近 if ((Input.mouseScrollDelta.y < 0 && Camera.main.fieldOfView >= 3) || Input.mouseScrollDelta.y > 0 && Camera.main.fieldOfView <= 80) { Camera.main.fieldOfView += Input.mouseScrollDelta.y * camDepthSmooth * Time.deltaTime; } } void LateUpdate() { //计算出相机的位置 Vector3 disPos = target.position + Vector3.up * distanceUp - target.forward * distanceAway; transform.position = Vector3.Lerp(transform.position, disPos, Time.deltaTime * smooth); //相机的角度 transform.LookAt(target.position); }
效果:
这就是我目前整理的三种可用于第三人称游戏的相机控制,希望能帮助到你!