《杜增强讲Unity之Tanks坦克大战》10-相机控制
10 相机控制
本节主要学习如何控制相机自动调整位置和焦距,使两个坦克一直同时在视野内.
在Hierarchy点击右键
点击 Create Empty,生成空对象,改名为CameraRig
设置CameraRig rotation为(40,60,0)
将MainCamera拖拽到CameraRig中,使之成为CameraRig的子对象
设置MainCamera的position为(0,0,-65),rotation为(0,0,0)
Orthographic Camera
Orthographic size
通过设置size实现缩放
Aspect宽高比
相机要做到事情有两个:跟随坦克和通过缩放实现坦克一直在屏幕内.
在wm/Scripts文件夹新建脚本CameraRig ,挂载到CameraRig上面
下面我们首先实现跟随坦克
跟随坦克首先找到坦克坐标的中间坐标,然后把cameraRig移动过去
先计算中间坐标
public Transform[] targets; // tanks
private Vector3 targetPos; // 计算出来的目标点
void FindAveragePos(){ // 计算平均坐标
Vector3 avg = new Vector3 (); // 计算平均坐标的临时变量 for (int i = 0; i < targets.Length; i++) { // 所有tank遍历一遍 avg += targets [i].position; // 所有坐标都加起来 } avg /= targets.Length; // 除以坦克个数,得到坐标的平均值 avg.y = transform.position.y; // 坐标的y轴保持不变 targetPos = avg; // 更新目标点 }
然后使用 Vector3.SmoothDamp 平滑阻尼是相机移动过去
还需要声明两个变量
private Vector3 moveSpeed; // 移动速度,SmoothDamp里面使用的
private float dampTime = 0.2f;// 到达目标的大约时间,SmoothDamp里面使用的
然后再Update()里面添加
transform.position = Vector3.SmoothDamp (transform.position, targetPos, moveSpeed, dampTime);
就可以缓动运动过去了.
CameraRig代码:
using UnityEngine;
using System.Collections;
public class CameraRig: MonoBehaviour {
public Transform[] targets; // tanks private Vector3 targetPos; // 计算出来的目标点 private Vector3 moveSpeed; // 移动速度,SmoothDamp里面使用的 private float dampTime = 0.2f;// 到达目标的大约时间,SmoothDamp里面使用的 // Use this for initialization void Start () { } // Update is called once per frame void Update () { FindAveragePos (); // 计算平均坐标 transform.position = Vector3.SmoothDamp (transform.position, targetPos,ref moveSpeed, dampTime);// 缓动效果 } void FindAveragePos(){ // 计算平均坐标 Vector3 avg = new Vector3 (); // 计算平均坐标的临时变量 for (int i = 0; i < targets.Length; i++) { // 所有tank遍历一遍 avg += targets [i].position; // 所有坐标都加起来 } avg /= targets.Length; // 除以坦克个数,得到坐标的平均值 avg.y = transform.position.y; // 坐标的y轴保持不变 targetPos = avg; // 更新目标点 }
}
回到unity,将两个坦克放到Targets里面
点击Play运行,就可以看到无论两个坦克怎么移动,此时相机一直会在两个坦克之间.
但是不一定总能看到两个坦克.
下面来计算一下size实现正确的缩放.
中间的点为targetPos,就是我们上面计算出来的那个坐标.
Y轴 size = distance.y
X轴 size = distance.x / aspect
取大的
最终版本代码截图
CameraRig最终代码:
using UnityEngine;
using System.Collections;
public class CameraRig: MonoBehaviour {
public Transform[] targets; // tanks private Vector3 targetPos; // 计算出来的目标点 private Vector3 moveSpeed; // 移动速度,SmoothDamp里面使用的 private float dampTime = 0.2f;// 到达目标的大约时间,SmoothDamp里面使用的 private Camera camera; // 相机 private float screenEdgeBuffer = 4f; // 边缘缓冲 private float minZoom = 6.5f; // 最小缩放值 private float zoomSpeed ;// 缩放速度 SmoothDamp里面使用 // Use this for initialization void Start () { camera = GetComponentInChildren<Camera> (); } // Update is called once per frame void Update () { FindAveragePos (); // 计算平均坐标 transform.position = Vector3.SmoothDamp (transform.position, targetPos,ref moveSpeed, dampTime);// 缓动移动 float zoom = FindZoomSize (); // 计算缩放值 camera.orthographicSize = Mathf.SmoothDamp (camera.orthographicSize, zoom, ref zoomSpeed, dampTime);// 缓动缩放 } void FindAveragePos(){ // 计算平均坐标 Vector3 avg = new Vector3 (); // 计算平均坐标的临时变量 for (int i = 0; i < targets.Length; i++) { // 所有tank遍历一遍 avg += targets [i].position; // 所有坐标都加起来 } avg /= targets.Length; // 除以坦克个数,得到坐标的平均值 avg.y = transform.position.y; // 坐标的y轴保持不变 targetPos = avg; // 更新目标点 } float FindZoomSize(){ // 计算缩放大小 float size = 0; // 临时缩放值变量 Vector3 localTargetPos = transform.InverseTransformPoint (targetPos);// 将目标点转换为相对于当前transform的本地坐标 for (int i = 0; i < targets.Length; i++) { // 变量所有坦克 Vector3 tankLocalPos = transform.InverseTransformPoint ( targets [i].position); // 坦克本地坐标 Vector3 distance = targetPos - tankLocalPos; // 和当前坦克的距离 size = Mathf.Max (size, Mathf.Abs (distance.y)); // y轴距离,取大的 size = Mathf.Max (size, Mathf.Abs (distance.x) / camera.aspect ) ; // x轴距离/aspect,取大的 } size += screenEdgeBuffer; // 加上屏幕边缘缓冲值 size = Mathf.Max (size, minZoom); // 不能小于最小缩放值 return size; }
}
---------------------------我是目录分割线---------------------------
《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
---------------------------我是目录分割线---------------------------
《杜增强讲Unity之Tanks坦克大战》10-相机控制的更多相关文章
- 《杜增强讲Unity之Tanks坦克大战》11-游戏流程控制
11 游戏流程控制 使用协程来控制游戏流程 11.1 添加MessageText 首先添加一个Text来显示文字 image 设置GameMgr image 11.2 游戏整体流程 下面Gam ...
- 《杜增强讲Unity之Tanks坦克大战》9-发射子弹时蓄力
9 发射子弹时蓄力 实现效果如下 image 按下开火键(坦克1为空格键)重置力为最小力,一直按着的时候蓄力,抬起的时候发射.如果按着的时候蓄力到最大,则自动发射,此时在抬起则不会重复发射. 首先 ...
- 《杜增强讲Unity之Tanks坦克大战》4-坦克的移动和旋转
4 坦克移动和旋转 本节课的目标是实现同时wsad和上下左右控制两个坦克分别移动和旋转 4.1 本节代码预览 image 将上节课场景s2另存为s3. 4.2 添加车轮扬沙效果 从Prefabs里 ...
- 《杜增强讲Unity之Tanks坦克大战》1-准备工作
0.案例介绍 0.1开始界面 点击Play Now 进入游戏界面 左边的坦克使用ws控制前后移动,ad键左右旋转,空格键开火 右边的坦克使用方向键上下控制前后移动,方向键左右键实现左右旋转 ...
- 《杜增强讲Unity之Tanks坦克大战》2-场景设置
2 场景设置 2.1 本节效果预览 2.2 项目目录设置 点击Project面板的Create按钮,在根目录下面新建wm文件夹 Wm文件夹用于存放我们自己生成的Prefab和脚本等其他资源, ...
- 《杜增强讲Unity之Tanks坦克大战》3-添加坦克
3 添加坦克 3.1 本节效果预览 3.2 另存新场景 首先打开上次的场景s1,另存为s2,放到同一个文件夹下面. 3.3 添加坦克模型 在Model文件夹下面找到Tank模型 将Tank ...
- 《杜增强讲Unity之Tanks坦克大战》5-子弹
5 子弹 本节的任务是创建子弹的Prefab image 首先从Model/Shell找到子弹的模型,拖入Hierarchy中,添加刚体组件,所有属性默认值. 添加Capsule Collider ...
- 《杜增强讲Unity之Tanks坦克大战》6-发射子弹
6 发射子弹 本节完成发射子弹的功能,最终代码如下: image 首先,发射子弹得确定发射的位置和方向,还有发射的初始速度.具体的发射速度和按下发射按键的时间长短有关,这个关于子弹的蓄力我们在第九 ...
- 《杜增强讲Unity之Tanks坦克大战》7-坦克血条
7 坦克血条 点击菜单GameObject->UI->Slider创建Slider 选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...
随机推荐
- 解决Elasticsearch问题的一些心得体会
在开始前先来介绍下背景:我的日志采集系统采用ELK(logstash(收集).elasticsearch(存储+搜索).kibana(展示)三个软件的简称)开源架构,在elasticsearch搭建了 ...
- 几种模型文件(CDM、LDM、PDM、OOM、BPM)
概念数据模型 (CDM): 帮助你分析信息系统的概念结构,识别主要实体.实体的属性及实体之间的联系.概念数据模型(CDM)比逻辑数据模型 (LDM)和物理数据模型(PDM)抽象.CDM 表现数据库的全 ...
- [Spark Core] Spark Client Job 提交三级调度框架
0. 说明 官方文档 Job Scheduling Spark 调度核心组件: DagScheduler TaskScheduler BackendScheduler 1. DagSchedule ...
- 深入浅出SharePoint2013——Search Schema配置
如果增加了新的Metadata,请上传文件到文档库后,并确保每个字段都填充了数据.然后执行全文爬网. 这样才会产生对应新的管理属性.
- DevExpress07、DataNavigator、 ControlNavigator
https://documentation.devexpress.com/WindowsForms/DevExpress.XtraEditors.DataNavigator.class 1.DataN ...
- beta冲刺————第三天(3/5)
完善的具体内容: 前端: (1)可以进行修改文字大小背景 其中,金色的文字个人觉得很好看,点赞.(我很满意啊) (2)可以改变成夜间模式(也很不错啊) 后端: 尝试将本地的后端war文件,以及数据库传 ...
- SDN期末作业博客
一.项目描述 A P4-based Network Load Balancing Application 基于P4的网络负载均衡项目 二.个人分工 The Controller : Acquire t ...
- Vue.js实现前段评论展示
本来想着给这个博客弄个回复系统(类似知乎的回复),最初的实现思路是这样的:主评论后台渲染,前台新增的评论,回复用jquery操作dom放到页面上.实现的时候感觉好复杂,大量的dom操作,目前前段框架不 ...
- Visual Studio内存泄露检測工具
使用简单介绍 在敲代码的过程中.难免会遇到内存泄露的时候.这个时候假设手工查找内存泄露,不说方法没有通用的,就是真的要自己手工查找也是非常耗时间和精力的.诚然.我们能够借助一些工具,并且我们还 ...
- Use MusicBrainz in iOS(三)查询专辑的完整信息
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/u010962810/article/details/24066737 本文讨论下通过专辑名获取专辑的 ...