类似这种效果

黑边的大小可以自行调整

这里为了方便直接用两个Button绑定了方法,有需要自行调用方法


1.首先制作上下两层黑边

创建Canvas然后在canvas上新建空物体,命名为CinemaCloseUpShot
在上面新建脚本CinemaCloseUP

public class CinemaCloseUP : MonoBehaviour
{
public float targetSizeInput; //上下黑条的宽度
public float showTime; //进行缩放所需的时间 private RectTransform topBar, bottomBar; //声明上下两个 RectTransform,该组件在UI中控制UI大小、位置等参数
private float changeSizeAmount; //上下黑条变化量
private bool isActive; //是否进行特写
private float targetSize; //
private void Awake()
{
//创建上方黑条,类型为图片
GameObject gameObject = new GameObject("topBar", typeof(Image));
gameObject.transform.SetParent(transform, false); //将之前的空物体设为父物体
gameObject.GetComponent<Image>().color = Color.black;//颜色设为黑色
topBar = gameObject.GetComponent<RectTransform>(); //获取黑条图片的RectTransform //将上方图片的锚点设为(0, 1)和(1, 1),其实就是父物体的左上角和右上角两个锚点
topBar.anchorMax = new Vector2(1, 1);
topBar.anchorMin = new Vector2(0, 1);
topBar.sizeDelta = new Vector2(0, 0); //默认图片大小为0 //创建下方黑条,类型为图片
gameObject = new GameObject("bottomBar", typeof(Image));
gameObject.transform.SetParent(transform, false);
gameObject.GetComponent<Image>().color = Color.black;
bottomBar = gameObject.GetComponent<RectTransform>(); //将下方图片的锚点设为(0, 0)和(1, 0),其实就是父物体的左下角和右下角两个锚点
bottomBar.anchorMax = new Vector2(1, 0);
bottomBar.anchorMin = new Vector2(0, 0);
bottomBar.sizeDelta = new Vector2(0, 0);//默认图片大小为0
} private void Update()
{
if (isActive)
{
Vector2 sizeDelta = topBar.sizeDelta; //声明一个sizeDelta,并赋值为topBar.sizeDelta
sizeDelta.y += changeSizeAmount * Time.deltaTime;//sizeDelta的y方向持续增加/减小,其实就是图片的宽
//根据下面两个方法,显示为正,隐藏为负
if (changeSizeAmount > 0) //点击显示的情况
{
if (sizeDelta.y >= targetSize) //如果sizeDelta.y达到最大宽度
{
sizeDelta.y = targetSize; //设置sizeDelta的宽度
isActive = false; //停止变化
}
}
else //点击隐藏的情况
{
if (sizeDelta.y <= targetSize) //如果sizeDelta.y达到最小宽度(0)
{
sizeDelta.y = targetSize; //设置sizeDelta的最小宽度(0)
isActive = false; //停止变化
}
}
//因为上下黑条对称,对上下黑条的宽度进行赋值
topBar.sizeDelta = sizeDelta;
bottomBar.sizeDelta = sizeDelta;
}
} public void ShowBar()
{
targetSize = targetSizeInput; //点击显示,对宽度赋值(在Inspector面板中设定)
changeSizeAmount = (targetSize - topBar.sizeDelta.y) / showTime; //黑条的改变速率,这里为正数
isActive = true; //开始变化
} public void Hide()
{
targetSize = 0f; //点击隐藏黑条宽度为0
changeSizeAmount = (targetSize - topBar.sizeDelta.y) / showTime; //黑条的改变速率,这里为负数
isActive = true; //开始变化
}
}

然后设置合适的参数
分别为黑边的高度和黑边变化的时间

2.摄像头聚焦的效果

给摄像机搭载脚本CameraPos

public class CameraPos : MonoBehaviour
{
public bool CamMove; //是否聚焦角色
public float distance; //距离角色的距离,可以用控制角色显示的大小
public float focusSpeed = 5f; //聚焦的速度 private Vector3 defaultPos; //摄像头默认位置
private Vector3 targetPos; //聚焦目标的位置
private bool isActive; //开始移动
private void Start()
{
defaultPos = transform.position;
}
private void Update()
{
if (isActive && CamMove)
{
transform.position = Vector3.Lerp(transform.position, targetPos, focusSpeed * Time.deltaTime);
}
}
public void FocusOn(GameObject target) //设置聚焦的目标
{
//注意这里的Z坐标不要大于0
targetPos = target.transform.position + new Vector3(0, 0, defaultPos.z + distance);
isActive = true;
}
public void ResetPos() //还原摄像头位置
{
targetPos = defaultPos;
isActive = true;
}
}

设置合适参数

注意这里Distance计算后的Z坐标不要大于0,可以在代码中添加限制

显示效果:

3D场景中也是改变摄像头位置来实现类似效果,实现的方法差不多

Unity制作特写镜头的更多相关文章

  1. 使用Unity制作游戏关卡的教程(三)

    转自:http://gamerboom.com/archives/75593 作者:Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth>的关 ...

  2. Unity制作FPS Demo

    等到把这个Unity FPS Demo[僵尸杀手]完成后再详细补充一下,使用Unity制作FPS游戏的经历,今天做个标识.

  3. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  4. 使用Unity制作游戏关卡的教程(二)

    转自:http://gamerboom.com/archives/75554 作者:by Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth> ...

  5. 使用Unity制作游戏关卡的教程(一)

    转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...

  6. 如何使用Unity制作虚拟导览(一)

    https://www.cnblogs.com/yangyisen/p/5108289.html Unity用来制作游戏已经是目前市场上的一个发展趋势,而且有越来越多的公司与开发者不断的加入,那么Un ...

  7. Unity制作地形的常用插件之GAIA

    用Unity制作大型游戏少了地形制作怎么行,用原生的Unity工具制作地形效率较低而且也不甚美观,后期运行的效率也得不到保证.下面推荐的专业地形制作工具可以帮助开发者解决地形制作的相关问题. 打开Un ...

  8. Unity制作王者荣耀商业级手游

    <王者荣耀>这种现象级手机游戏是如何制作出来的呢?本文以<王者荣耀>MOBO类型的多人在线战术竞技游戏为入口,覆盖Unity游戏制作开发前端与Node.js服务器端的开发必备知 ...

  9. Unity 特写镜头

    using UnityEngine; public class Camera_Feature : MonoBehaviour { public static Camera_Feature instan ...

随机推荐

  1. 原生 JS 实现 VS Code 自动切换输入法状态!这次没有AHK

    上一篇文章:使用 AHK 在 VS Code 中根据上下文自动切换输入法状态 给出一个使用 ahk 在 VSCode 自动切换输入法的方法.不过这个方法实际上很蹩脚,一点都不优(zhuang)雅(bi ...

  2. 可移植的python环境

    创建可移植的python环境 工作时使用的系统不联网,而且自带的python环境库不完整,每次干活都心累,所以想要做一个可移植的精简版的python环境. 开始前的准备: Ubuntu18.04 py ...

  3. VMware安装win7后,安装VMware Tools时报错安装程序无法继续。本程序需要您将此虚拟机上安装的操作系统更新到SP1

    具体报错: 倘若你用的是这样的镜像:cn_windows_7_enterprise_x64_dvd_x15-70741.iso 换镜像源.换镜像源.换镜像源! 换成带sp1的iso镜像:cn_wind ...

  4. 初学者都能学会的ElasticSearch入门实战

    大家好,我是咔咔 不期速成,日拱一卒 项目中准备使用ElasticSearch,之前只是对ElasticSearch有过简单的了解没有系统的学习,本系列文章将从基础的学习再到深入的使用. 咔咔之前写了 ...

  5. 《HelloGitHub》第 72 期

    兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣.入门级的开源项目. https://github.com/521xueweiha ...

  6. webapi_3 今天真真真全是大经典案例

    这个项目一多起来了,还是分个序号比价好一点,你好我好大家好,然后关于这个标点符号的问题,我打字真的很不喜欢打标点符号,不是不好按,按个逗号其实也是顺便的事情,可能就是养成习惯了,就喜欢按个空格来分开, ...

  7. C++_STL_all_of

    all_of 功能描述 如果在[first,last)范围内的数组进行判断, 如果pred返回true返回true 否则返回false 等同于 template<class InputItera ...

  8. MySQL 数据库作发布系统的存储,一天五万条以上的增量, 预计运维三年,怎么优化?

    1.设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率. 2.选择合适的表字段数据类型和存储引擎,适当的添加索引. 3.MySQL 库主从读写分离. 4.找规律分表,减少单表中 ...

  9. 用TLS/SSL保证EMQ的网络传输安全

    作为基于现代密码学公钥算法的安全协议,TLS/SSL能在计算机通讯网络上保证传输安全,EMQ的MQTT broker支持TLS,也可以用这种方式来确保传输安全. 参考官网:https://www.em ...

  10. 在虚拟机里面安装mysql

    https://dev.mysql.com/downloads/repo/yum/ 首先到网站里面下载 mysql80-community-release-el7-3.noarch.rpm 通过xft ...