Unity3D第三人称视角摄像机、跟随与球面旋转
逻辑释义图解分析Unity C#代码逻辑释义
【关键transform】1[玩家]2[注视目标点]3[摄像机]
[摄像机]跟随[注视目标点],[注视目标点]跟随[玩家]
【看向注视目标点】摄像机 用transform.LookAt()方法. 始终看向 注视目标点
【视角垂直旋转】摄像机始终根据 注视目标点的后方向量与上方向量或下方向量 插值获得 偏移向量.
调整插值 以获得 垂直旋转的效果
【视角水平旋转】注视目标点水平旋转, 带动 摄像机水平旋转
【视角远近缩放】获得偏移向量后 修改偏移向量长度
【Unity使用】脚本组件挂到[摄像机]上 [玩家]物体 需添加Tag“Player” (或public Transform player ;手动挂载)
图解分析
Unity C#代码
using System.Collections;using System.Collections.Generic;using UnityEngine;public class SphereCamera : MonoBehaviour{private Transform player; //玩家private Transform watchPoint; //注视目标点private float watchPointHeight = 1.7f; //注视目标点高度private float distance = 2.8f; //当前 摄像机到目标点距离private float distanceMax = 5.0f; //到目标点最大距离private float distanceMin = 1.0f; //到目标点最小距离private float distanceSpeed = 0.3f; //距离增减速度private float rotationY; //水平旋转private float rotationYSpeed = 1.5f; //水平旋转速度private float AngleLerp; //当前垂直角度 插值系数private float AngleMax = 80.0f; //最大垂直角度private float AngleMin = -40.0f; //最小垂直角度private float AngleSpeed = 0.02f; //垂直旋转速度private Vector3 finalVec = new Vector3(); //最终偏移向量private void Start(){//寻找标签 获得玩家Transformplayer = GameObject.FindGameObjectWithTag("Player").transform;//实例化注视目标点物体watchPoint = new GameObject().transform;}private void FixedUpdate(){ChangeDistance(); //滚轮增减 摄像机到目标点距离ChangeRotationY(); //水平旋转ChangeAngle(); //垂直旋转FinalCameraPos(); //摄像机最终位置}private void ChangeDistance() //滚轮增减 摄像机到目标点距离{//接收鼠标滚轮输入if (Input.GetAxis("Mouse ScrollWheel") < 0){//改变 当前到目标点距离distance += distanceSpeed;//限制 到目标点距离最大值if (distance > distanceMax){distance = distanceMax;}}else if (Input.GetAxis("Mouse ScrollWheel") > 0){//改变 当前到目标点距离distance -= distanceSpeed;//限制 到目标点距离最小值if (distance < distanceMin){distance = distanceMin;}}}private void ChangeRotationY() //水平旋转{//获得鼠标X轴移动值 修改水平旋转值rotationY = Input.GetAxis("Mouse X") * rotationYSpeed;//注视目标点 水平旋转watchPoint.Rotate(0, rotationY, 0);}private void ChangeAngle() //垂直旋转{//鼠标Y轴移动 修改 垂直角度插值系数AngleLerp -= Input.GetAxis("Mouse Y") * AngleSpeed;//限制 垂直角度插值系数 最大最小值if (AngleLerp > AngleMax / 90.0f) //除90度 获得 最大 垂直角度插值系数{AngleLerp = AngleMax / 90.0f;}else if (AngleLerp < AngleMin / 90.0f) {AngleLerp = AngleMin / 90.0f;}//判断 当前垂直角度插值系数 正负//根据 注视目标点的 后方向量 上方或下方向量 与 当前垂直角度插值系数//获得 偏移向量的方向if (AngleLerp > 0)finalVec = Vector3.Lerp(-watchPoint.forward, watchPoint.up, AngleLerp);elsefinalVec = Vector3.Lerp(-watchPoint.forward, -watchPoint.up, -AngleLerp); //垂直角度插值系数 取正finalVec.Normalize(); //单位化偏移向量长度为1finalVec *= distance; //设定 偏移向量的长度}private void FinalCameraPos() //摄像机最终位置{//注视目标点位置 跟随 玩家位置Vector3 PointPos = player.position;PointPos.y += watchPointHeight; //修改 注视目标点 高度//弹簧移动效果 插值实现watchPoint.position = Vector3.Lerp(watchPoint.position, PointPos, 0.9f);//摄像机位置 根据注视目标点位置 进行偏移Vector3 cameraPos = watchPoint.position + finalVec;//弹簧移动效果 插值实现transform.position = Vector3.Lerp(transform.position, cameraPos, 0.2f);//摄像机始终看向 注视目标点transform.LookAt(watchPoint.position);}}