using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 相机跟随角色
/// 功能:支持滚轮缩放,以及鼠标右键绕角色水平以及垂直查看
/// </summary>
public class CamFollowRole : MonoBehaviour
{
// 缩放速度
public float scrollSpeed = 2;
// 旋转速度
public float rotateXSpeed = 2;
public float rotateYSpeed = 2;
public float distance;
// 偏移
private Vector3 offset;
// 相机跟随的角色
private Transform player;
private bool isRotate = false;
// Start is called before the first frame update
void Start()
{
player = GameObject.FindGameObjectWithTag("Player").transform;
offset = transform.position - player.position;
}
private void Update()
{
transform.position = player.position + offset;
// 鼠标右键按下、抬起
if (Input.GetMouseButtonDown(1))
isRotate = true;
if (Input.GetMouseButtonUp(1))
isRotate = false;
// 旋转
if (isRotate)
{
float X = Input.GetAxis("Mouse X");
if (X != 0)
{
// 绕对象物体水平旋转
transform.RotateAround(player.position, player.up, X * rotateXSpeed);
}
float Y = Input.GetAxis("Mouse Y");
if (Y != 0)
{
// 记录相机前一帧的位置与旋转
Vector3 originalPos = transform.position;
Quaternion originalRotation = transform.rotation;
// 绕对象物体垂直旋转
transform.RotateAround(player.position, transform.right, Y * rotateYSpeed);
// 限制旋转角度 (当角度超过后,让旋转无效)
float transX = transform.eulerAngles.x;
if (transX < 10 || transX > 80)
{
transform.position = originalPos;
transform.rotation = originalRotation;
}
}
// 在旋转过程中,偏移也要跟随变化
offset = transform.position - player.position;
}
// 缩放
float scrollView = Input.GetAxis("Mouse ScrollWheel");
if (scrollView != 0)
{
distance = offset.magnitude;
distance += scrollView * scrollSpeed; // 拉近\拉远视野
distance = Mathf.Clamp(distance, 3, 15); // 限制距离 拉近限制最小3,拉远限制最大15
offset = offset.normalized * distance; //重新计算偏移(方向*距离)
}
}
}
脚本挂在跟随物体的相机上,鼠标右键按下并拖拽后,相机可围绕对象进行水平(360度)、垂直旋转(可自行限制)。