Unity-3D相机跟随控制

  • 跟随算法
  • 横向与纵向旋转摄像机
  • 滚轮调节距离
  • 全部代码

跟随算法

要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动。
要想让相机跟随物体移动,就要明白在一定角度下相机与物体的位置关系。

首先设置相机与物体之间的距离distance,相机与xz平面的角度为roll
所以根据三角关系可以求得映射在xz平面的距离d为distancecos(rool),相机高度为distancesin(roll)。
如下图

现在就可以确定相机的高度了即y轴的坐标相机的y轴坐标应该为 Camera.Main.y=物体.y+height

在xz平面中,设相机与物体的距离为d(就是上面说的那个d,distance映射在xz平面的长度),相机的旋转角度为rot。根据下图可以看到,相机与物体的连线与x轴的角度为rot-180.根据三角函数,既可以得出x轴的位移为d*sin(rot),z轴的位移为d*cos(rot)
所以说开始的时候指定distance和rot和roll就可以实现跟随了。实现跟随的代码如下

public class CameraFollow : MonoBehaviour
{//距离public float distance = 15;//横向角度public float rot = 0;//纵向角度  30d度public float roll = 30f * Mathf.PI * 2 / 360;//目标物体public GameObject target;private void Start(){target = GameObject.Find("Black Track");}private void LateUpdate(){if (target == null)return;if (Camera.main == null)return;//目标的坐标Vector3 targetPos = target.transform.position;//用三角函数计算相机的位置Vector3 cameraPos;float d = distance * Mathf.Cos(roll);float height = distance * Mathf.Sin(roll);cameraPos.x = targetPos.x + d * Mathf.Cos(rot);cameraPos.z = targetPos.z + d * Mathf.Sin(rot);cameraPos.y = targetPos.y + height;Camera.main.transform.position = cameraPos;Camera.main.transform.LookAt(target.transform);}
}

在跟随的时候我们可以在要跟随的物体下放置一个子物体命名为cameraPoint使相机对准这个子物体从而方便的更改摄像机的视角。
所以在物体下添加一个cameraPoint的子物体

并且添加代码

//设置目标public void SetTarget(GameObject target){if (target.transform.Find("cameraPoint") != null)this.target = target.transform.Find("cameraPoint").gameObject;elsethis.target = target;}

如果准的物体有名为cameraPoint的子物体,那么相机对准cameraPoint子物体。

横向与纵向旋转摄像机

当鼠标向左移动时,相机随之左转,当鼠标向右移动时,相机随之右转。
Unity的输入轴Mouse X 和 Mouse Y 代表着鼠标的移动增量,也就是说当鼠标向左移动时,Input.GetAxis(“Mouse X”)的值会增大,向右则减少。只要让旋转角度rot与Mouse X成正比关系,便能通过鼠标控制摄像机的角度。
代码如下

    //横向旋转速度public float rotSpeed=0.1f;//横向旋转public void Rotate(){float w = Input.GetAxis("Mouse X") * rotSpeed;rot -= w;}

同理对于纵向旋转我们需要设定一个范围 所以代码如下

    //纵向旋转角度public float maxRoll = 70f * Mathf.PI * 2 / 360;public float minRoll = 0f * Mathf.PI * 2 / 360;//纵向旋转速度private float rollSpeed = 0.1f;//纵向旋转public void Roll(){float w = Input.GetAxis("Mouse Y") * rollSpeed;roll -= w;if (roll > maxRoll)roll = maxRoll;if (roll < minRoll)roll = minRoll;}

滚轮调节距离

通过鼠标滚轮调整相机与物体之间的距离
代码如下

    //距离范围public float maxDistance = 22f;public float minDistance = 5f;//距离变化速度public float zoomSpeed = 0.2f;//调整距离public void Zoom(){if(Input.GetAxis("Mouse ScrollWheel") >0){if (distance > minDistance)distance -= zoomSpeed;}else if (Input.GetAxis("Mouse ScrollWheel") < 0){if (distance < maxDistance)distance += zoomSpeed;}}

全部代码

public class CameraFollow : MonoBehaviour
{//距离public float distance = 15;//横向角度public float rot = 0;//纵向角度  30d度public float roll = 30f * Mathf.PI * 2 / 360;//目标物体public GameObject target;//横向旋转速度public float rotSpeed=0.1f;//纵向旋转角度public float maxRoll = 70f * Mathf.PI * 2 / 360;public float minRoll = 0f * Mathf.PI * 2 / 360;//纵向旋转速度private float rollSpeed = 0.1f;//距离范围public float maxDistance = 22f;public float minDistance = 5f;//距离变化速度public float zoomSpeed = 0.2f;private void Start(){target = GameObject.Find("Black Track");SetTarget(target);}private void LateUpdate(){if (target == null)return;if (Camera.main == null)return;//横向旋转Rotate();//纵向旋转Roll();//缩放Zoom();//目标的坐标Vector3 targetPos = target.transform.position;//用三角函数计算相机的位置Vector3 cameraPos;float d = distance * Mathf.Cos(roll);float height = distance * Mathf.Sin(roll);cameraPos.x = targetPos.x + d * Mathf.Cos(rot);cameraPos.z = targetPos.z + d * Mathf.Sin(rot);cameraPos.y = targetPos.y + height;Camera.main.transform.position = cameraPos;Camera.main.transform.LookAt(target.transform);}//设置目标public void SetTarget(GameObject target){if (target.transform.Find("cameraPoint") != null)this.target = target.transform.Find("cameraPoint").gameObject;elsethis.target = target;}//横向旋转public void Rotate(){float w = Input.GetAxis("Mouse X") * rotSpeed;rot -= w;}//纵向旋转public void Roll(){float w = Input.GetAxis("Mouse Y") * rollSpeed;roll -= w;if (roll > maxRoll)roll = maxRoll;if (roll < minRoll)roll = minRoll;}//调整距离public void Zoom(){if(Input.GetAxis("Mouse ScrollWheel") >0){if (distance > minDistance)distance -= zoomSpeed;}else if (Input.GetAxis("Mouse ScrollWheel") < 0){if (distance < maxDistance)distance += zoomSpeed;}}
}

Unity-3D相机跟随控制相关推荐

  1. unity 启动相机_Unity3D实现相机跟随控制

    本文实例为大家分享了Unity3D实现相机跟随控制的具体代码,供大家参考,具体内容如下 跟随算法 要实现3D摄像机的控制第一步就是先实现摄像机跟随物体移动. 要想让相机跟随物体移动,就要明白在一定角度 ...

  2. Unity中相机跟随人物移动

    方法1:将相机拖到人物的游戏对象上,也就是让相机成为角色的子物体,这样相机就会跟随角色移动 但是这样会存在问题,1.相机会随着人物的翻转而翻转,2.相机跟随人物没有缓冲效果,移动比较僵硬 方法2:代码 ...

  3. 【Unity 3D学习】控制Animator动画从随机帧开始

    一.前提:游戏主场景有很多建筑,然后建筑上会有动画,如果存在多个同类型的建筑,就会出现多个相同动画频率一致的情况,这样子产品说体验性较差,所以考虑怎么控制动画从不同帧开始播放. 二.处理方案. 1.原 ...

  4. Unity相机跟随以及子弹发射笔记

    相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动. 步骤1. 创建和设置CameraMount 在层级(Hierar ...

  5. 【Unity】实现相机跟随及视角转动

    [unity]实现相机跟随,人物移动请参照[Unity] 实现角色移动.视角旋转以及跳跃 第一种实现方法(比较简单) 1.创建一个Camera,将Camera置于物体Player下 随意拖动Camer ...

  6. Unity相机跟随第一视角移动

    1.打开unity,新建一个场景,简单做一个胶囊体代表人物 2.给第一人称胶囊体添加如下代码,使其通过上下左右键移动 using System.Collections; using System.Co ...

  7. 3D人物移动和相机跟随_学习整理资料

    核心1.新建工程,取名Exercise_3D. 2.新建个文件夹(3D_Assets),将所有素材资源,导入或拖入. 3.新建一个3DObject--Plane,取名(Ground)作为地面. 4.新 ...

  8. RPG游戏人物视角控制,相机跟随

    因为被人物视角控制困扰了好久,终于搞明白了,所以想记下来再梳理一遍,也希望大神看到能给我这个新人一些建议. 首先列出我参考了的博客: 游戏之角色移动和相机跟随 雨松大神解读的官方相机跟随脚本(我只看了 ...

  9. Unity场景中的双相机设置,3D相机和2D相机设置

    unity场景中需要双相机,其中3D相机专摄场景物体3D显示,2D相机则专用于显示屏幕的UI元素. 3D设置: 2D设置:(别忘了给Canvas拖一下相机路径) 注意相机的Clipping Plane ...

最新文章

  1. plotly基于dataframe数据绘制股票OHLC图
  2. Spring入门第十三课
  3. oracle 11gR2 RAC 安装
  4. java添加文字水印插件_java之io添加文字水印
  5. Powercli的一些使用案例
  6. Java8排序–性能陷阱
  7. ArcGIS中的WKID(转)
  8. [HAOI2010]计数 数位DP+组合数
  9. php整形数组求里面的质数,PHP实现的分解质因数操作示例
  10. 32.go defer
  11. Atitit 订单处理原理与功能设计attilax总结
  12. 多智能体协同视觉SLAM技术研究进展
  13. 惠普m1216硒鼓清零步骤_hpm1213nf清零
  14. 16台服务器达成1000万tpmC!挑战分布式数据库性能极限
  15. Android 动态申请相机权限
  16. H.264/AVC 的各大主流编解码器
  17. 微信PC端测试版更新:新增视频号直播工具
  18. 应用计算机测量电阻伏安特性,实验2“电阻的伏安特性曲线”数据处理示范
  19. Matlab常用图像处理命令108例(二)
  20. Python+Vue计算机毕业设计房屋租赁管理系统p8pvy(源码+程序+LW+部署)

热门文章

  1. 危害网络计算机安全罪判刑几年,帮助信息网络犯罪活动行为涉嫌成立犯罪的一般判刑多少年...
  2. 段永平的第四个徒弟:拼多多黄峥学会了打法,没领悟到本分
  3. 使用Metasploit框架测试ms08-067模块
  4. 将DAT格式视频文件转换成ASF和WMV格式视频文件
  5. 如何用androidstudio自带监控内存工具监控内存
  6. python笔试题奥特曼打怪兽_一个python面试笔试题
  7. 小凡实验室卧龙老师CCIE学习方法:CCIE涅槃五剑
  8. 键盘的后退键导致页面关闭
  9. python开发的著名网站_python开发著名网站_python开发的著名软件 - CSDN
  10. ibm软件下载网页链接