Unity 第三人称相机跟随,控制相机转动且始终朝向角色
这里写目录标题
首先我们要创建一个代码,名字就叫 FollowPlayer ,相机跟随玩家,因为在下面的全部代码中用的是这个名字,大家复制时注意名字。
另外Unity中的代码文件名和代码中的命名空间也一定要一致。
将此脚本挂载在相机上,然后打开脚本进行编辑。
Start
首先我们要定义很多变量,并且在Start函数中给其赋值。变量分别代表什么意思将在注释中展现。
private Transform player;//玩家的位置
private Vector3 offsetPosition; //位置偏移
private bool isRotate;//鼠标右键是否按下
public float distance;
public float scrollSpeed = 10;//视野远近变化的快慢
public float RotateSpeed = 2;//镜头转向的速度
// Use this for initialization
void Start () {
player = GameObject.FindGameObjectWithTag(Tags.player).transform;
transform.LookAt(player.position);
offsetPosition = transform.position - player.position;
}
Update
然后写两个函数 ScrollView 和 RotateView 分别控制镜头的转向和视野拉近拉远。并且让这两个函数在Update里运行
这里要注意的是RotateView函数一定要在前面运行,否则会有影响
这里可以尝试将两个函数位置互换,帮助理解代码含义。
void Update () {
transform.position = offsetPosition + player.position;
//更新相机的位置
RotateView();
ScrollView();
}
用 ScrollView 函数控制滑轮拉近拉远视野
//鼠标滑轮拉近拉远视野
distance = offsetPosition.magnitude;
distance -= Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
distance = Mathf.Clamp(distance, 2, 18);
//限制镜头缩放最远以及最近距离
offsetPosition = offsetPosition.normalized * distance;
用 RotateView 函数 控制玩家点击右键时可以拖动视角
if (Input.GetMouseButtonDown(1))
{
isRotate = true;
}
if (Input.GetMouseButtonUp(1))
{
isRotate = false;
}
if (isRotate)
{
transform.RotateAround(player.position,player.up, RotateSpeed * Input.GetAxis("Mouse X"));
Vector3 originalPos = transform.position;
Quaternion originalRotation = transform.rotation;
transform.RotateAround(player.position,transform.right, -RotateSpeed * Input.GetAxis("Mouse Y"));
//垂直和水平都会影响两个值
float x = transform.eulerAngles.x;
if (x < 10 || x > 80)
{
transform.position = originalPos;
transform.rotation = originalRotation;
}
}
offsetPosition = transform.position - player.position;
这里是全部代码👇
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FollowPlayer : MonoBehaviour {
private Transform player;
private Vector3 offsetPosition; //位置偏移
private bool isRotate;
public float distance;
public float scrollSpeed = 10;
public float RotateSpeed = 2;
// Use this for initialization
void Start () {
player = GameObject.FindGameObjectWithTag(Tags.player).transform;
transform.LookAt(player.position);
offsetPosition = transform.position - player.position;
}
// Update is called once per frame
void Update () {
transform.position = offsetPosition + player.position;
RotateView();
ScrollView();
}
void ScrollView()
{
//鼠标滑轮拉近拉远视野
distance = offsetPosition.magnitude;
distance -= Input.GetAxis("Mouse ScrollWheel") * scrollSpeed;
distance = Mathf.Clamp(distance, 2, 18);//限制镜头缩放最远以及最近距离
offsetPosition = offsetPosition.normalized * distance;
}
void RotateView()
{
if (Input.GetMouseButtonDown(1))
{
isRotate = true;
}
if (Input.GetMouseButtonUp(1))
{
isRotate = false;
}
if (isRotate)
{
transform.RotateAround(player.position,player.up, RotateSpeed * Input.GetAxis("Mouse X"));
Vector3 originalPos = transform.position;
Quaternion originalRotation = transform.rotation;
transform.RotateAround(player.position,transform.right, -RotateSpeed * Input.GetAxis("Mouse Y"));
//垂直和水平都会影响两个值
float x = transform.eulerAngles.x;
if (x < 10 || x > 80)
{
transform.position = originalPos;
transform.rotation = originalRotation;
}
}
offsetPosition = transform.position - player.position;
}
}