Unity 第三人称相机跟随,控制相机转动且始终朝向角色

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;
    }
}

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值