类似这种效果

黑边的大小可以自行调整

这里为了方便直接用两个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. mongoDb入门并整合springboot

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 MongoDb简介 MongoDb是一种非关系型数据库,是现在非常火热的noSQL.也被称为文档性数据库.(可存放json,xml等格式) mo ...

  2. mysql(mariadb)安装

    mysql(mariadb)安装 前言 MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将My ...

  3. 12.16 JAVA swing

    ------------恢复内容开始------------ 12.16JAVA swing 1.框架 JFrame>JPanel>组件JButton JTestfilled JTable ...

  4. Java基础(补充)

    为什么 Java 中只有值传递? 开始之前,我们先来搞懂下面这两个概念: 形参&实参 值传递&引用传递 形参&实参 方法的定义可能会用到 参数(有参的方法),参数在程序语言中分 ...

  5. 如何规划一台 Linux 主机,步骤是怎样?

    1.确定机器是做什么用的,比如是做 WEB .DB.还是游戏服务器.不同的用途,机器的配置会有所不同.    2.确定好之后,就要定系统需要怎么安装,默认安装哪些系统.分区怎么做.    3.需要优化 ...

  6. Java使用多线程异步执行批量更新操作

    import com.google.common.collect.Lists; import org.apache.commons.collections.CollectionUtils; impor ...

  7. springboot服务引入外部jar包在windows运行正常,在linux环境上无法加载到引入jar包的类

    一.问题描述 最近开发了一个springboot程序,需要依赖第三方jar包,这个jar包无法直接通过pom远程仓库下载,需要从自己本地引入,于是配置pom文件如下:将本地jar包引入工程,syste ...

  8. Java 中如何实现序列化,有什么意义?

    序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流 化.可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间. 序列化是为了解决对象流读写操作时可能引发的问题(如果不进 ...

  9. Mac SVN Cornerstone 安装使用详解

    Cornerstone 是收费软键,这里提供一个破解版 ,安装后需要输入安装密码:www.ifunmac.com 链接:https://pan.baidu.com/s/1LqY2s8vEJAQ9JJh ...

  10. Vue Avoided redundant navigation to current location Error

    这个报错的根源就是vue-router组件,错误内容翻译一下是: Avoided redundant navigation to current location === 避免冗余导航到当前位置 这个 ...