100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Unity3D第三人称视角摄像机 跟随与球面旋转

Unity3D第三人称视角摄像机 跟随与球面旋转

时间:2020-01-20 09:54:49

相关推荐

Unity3D第三人称视角摄像机 跟随与球面旋转

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。