前言

在许多的第三人称游戏中,我们的摄像机往往保持着一定的偏移,跟随着我们的角色。但是常常会出现的一种情况就是,当我们的角色走进室内或者靠近墙边或障碍物的时候,如果这个偏移保持不变的话,我们的摄像机就可能会跑到墙体里,或者看向角色时被墙体或障碍物所挡住。因此这种情况下我们的相机往往需要一些特殊的处理,例如修改偏移量来拉近相机与角色的距离等,来防止上述情况的出现。

在以往我们可能需要通过射线检测或者碰撞检测等,然后编写一大堆的代码做一堆复杂的判断来修改我们的摄像机的位置。但是有了Cinemachine后,我们只需要通过一些简单的设置,就可以不用写任何代码来实现上面的效果了,并且效果也是很棒的,可以大大提高了我们的研发效率。

视频链接:https://www.bilibili.com/video/BV1Kt411Y71n

Demo:https://github.com/luckyWjr/Demo Cinemachine文件夹下的DemoCollider

准备

我们可以先创建一个测试场景,添加一个胶囊体来模拟角色。根据第一篇所提到的知识,我们可以在测试场景中创建一个VirtualCamera,将其的Follow和Look At属性都设置成我们添加的胶囊体,这样一个简单的第三人称摄像头就实现了。接着我们可以简单的添加一些障碍物,然后移动我们的胶囊体,使其经过障碍物,例如下图:

我们可以发现在未经特殊处理的情况下,障碍物就会遮住我们的角色,这必然是一种不友好的游戏体验。我们的期望效果是当摄像机和角色中间出现障碍物时,摄像机可以移动到障碍物前方,来防止角色被遮挡。优化后的效果如下:

想要实现这种不会穿墙的摄像头效果,我们只需要在VirtualCamera的Extensions中添加CinemachineCollider即可。

Cinemachine Collider

简介

Cinemachine Collider会对我们VirtualCamera的位置进行后期处理,来保持Camera的视线不会被障碍物所遮挡。添加了Cinemachine Collider后,VirtualCamera会做下列事情:

  • 使Camera远离场景中阻挡视线的障碍物
  • 若障碍物在Camera和Look At的目标之间,则移动Camera到障碍物前方
  • 计算拍摄质量(shot quality)

Cinemachine Collider原理是利用物理射线(Physics Raycaster)检测,因此需要潜在的障碍物都要带有碰撞体组件,这会导致性能消耗。若消耗过高,需要考虑使用其他方法来代替。

shot quality

拍摄质量(shot quality),是指对VirtualCamera到理想位置的距离,VirtualCamera到Look At目标的距离,以及阻挡视线的障碍物等的一种评估。例如视线中的障碍物越多,那么ShotQuality的值就会越低。它在其他模块中会使用到,例如Clear Shot(下一篇文章将会介绍到)

我们可以通过下面方法来获得该值,默认为1,值越大说明画面效果越好。

CinemachineVirtualCamera.State.ShotQuality

属性

了解了Cinemachine Collider的功能后,我们先来看看它里面的一些相关属性的含义,只有了解了各个属性的意义,才能配置出最适合自己游戏的参数。

Collide Against

当障碍物属于Collide Against设置中选择的Layer时,才会属于潜在障碍物,参与计算。该属性没有选择的Layer中的GameObject会被忽略。

Ignore Tag

属于Ignore Tag设置中选择的Tag的GameObject会被忽略。

Transparent Layers

属于Transparent Layers设置中选择的Layer的GameObject会被当做是透明物体,即不会遮挡住视线,会被忽略。

Minimum Distance From Target

最小辨识距离,如果障碍物到目标轴心点的距离小于设置的值,会被忽略。

Avoid Obstacles

若勾选,当目标被障碍物遮挡时,会移动我们的Camera来避开障碍物。

若不勾选,则不会尝试移动Camera来避开障碍物,但是会根据障碍物来报告shot quality。

Distance Limit

设置从Camera射出射线的最大长度,若值为0即指Camera到目标的距离。超过该长度的障碍物会被忽略。

Minimum Occlusion Time

设置一个时间,只有当障碍物遮挡住的目标的时间超过这个时间才会进行处理。这样可以忽略掉一些转瞬即逝的遮挡物。

Camera Radius

指的是Camera到任何一个障碍物所需要保持的最小距离,值越大Camera会离潜在障碍物越远,尝试保持较小的值会有比较好的效果以及节省性能。如果由于Camera的FOV较大而看见一些内部障碍物,我们可以适当增加这个值。

Strategy

Camera防止被障碍物遮挡视线所尝试的方法,有如下三种:

Pull Camera Forward

Camera沿着自身的z轴方向向前移动,直到移动到距离目标最近的障碍物之前。

Preserve Camera Height

将相机移动到一个不会被障碍物遮挡视线的点,同时尝试保持Camera的原始高度不变。

Preserve Camera Distance

将相机移动到一个不会被障碍物遮挡视线的点,同时尝试保持Camera到目标的原始距离不变。

Maximum Effort

设置一次最多可处理多少个障碍物,值越大性能消耗越大,一般场景中设置为4就足够了。

Smoothing Time

Camera停留在离目标最近的点时的最小时间,即当视线中没有遮挡物时,Camera不会立即恢复到原始的偏移量,而会先保持一会当前的偏移量,保持时间取决于该属性设置的值。

适用于Camera需要经过很多障碍物的情况,可以避免Camera频繁的移动。

Damping

当障碍物消失,Camera恢复到原始的偏移量的速度。值越大反应越慢。

Damping When Occluded

当出现障碍物,Camera移动到避开障碍物位置的速度。值越大反应越慢。

Optimal Target Distance

该属性主要应用于Clear Shot功能。设置为0的话代表关闭该功能,若设置了大于0的值,那么当目标到相机的距离越接近这个值,就会获得越高的评分。该评分在Clear Shot选择合适的VirtualCamera时会起到作用。

总结

我们可以通过调整VirtualCamera以及CinemachineCollider的属性,来很轻松的实现第三人称游戏中,Camera的视线被障碍物遮挡的问题。

该功能也是Cinemachine中实用的功能之一,更多功能后续介绍。

补充

1.若在移动我们目标的时候,发现Camera有来回晃动/切换的情况,可以试着把我们的目标的Layer设置的和障碍物不一样。经过测试发现如果目标的Layer和障碍物的Layer相同,那么目标自身也会被当做一种障碍物,影响运算。

Cinemachine(二)制作不会穿墙(会避开障碍物)的摄像头(Cinemachine Collider)相关推荐

  1. android cpp做成so库,Android增量更新(二)—制作合成文件so库

    ###前言 在上节中,我们已经学习了`Android增量更新`的实现原理,那么在Android开发的移动端,我们需要涉及到的其实是`文件合成`的这个流程. 那么,今天就来讲讲增量更新合成流程的实现吧. ...

  2. C++多态案例二-制作饮品

    多态案例二-制作饮品 多态案例二-制作饮品 示例 多态案例二-制作饮品 案例描述: 制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供 ...

  3. html实现用户调查的表单网页,江苏开放大学网页制作基础及HTML测试作业二制作1个E游调查的表单网页...

    资源下载资源下载价格10元立即支付  或  升级VIP后 8 折优惠立即升级 购买问题请提交工单 江苏开放大学网页制作基础及HTML测试作业一制作介绍中国瀑布的图文混排网页:http://www.dd ...

  4. 【b站黑马程序员C++视频学习笔记-多态案例二-制作饮品】

    多态案例二-制作饮品 利用多态实现制作咖啡和茶水 Coffee和Tea继承了抽象类AbstractDrinking,并重写了AbstractDrinking的抽象函数 #include<iost ...

  5. 实现AI角色的自主移动-避开障碍物Obstacle行为

    避开障碍物(Obstacle)行为 避开障碍物行为是指操控AI角色避开路上的障碍物,例如动物奔跑时,避免与树.墙碰撞.当AI角色的行进路线上发现比较近的障碍时,产生一个排斥力,是AI角色远离这个障碍物 ...

  6. 【A_star二维路径规划】基于matlab A_star算法无人机二维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】

    ⛄一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[A_star二维路径规划]基于matlab A_s ...

  7. Opencv 摄像头二次开发,横竖屏切换,前后摄像头切换,铺满全屏问题,一次解决(附源码)

    Android Opencv 4.2 摄像头二次开发之 横竖屏切换,前后摄像头切换,铺满全屏问题,相机无法启动问题,一次解决 问题1.横竖屏切换崩溃问题 描述: 主要是原生的Opencv demo中没 ...

  8. WDS部署操作系统之二 制作并捕获模板计算机映像

    前面我们实现了WDS部署全新windows7操作系统,但这些系统都没有安装相关办公软件,需要后续再安装,比较麻烦.那如何制作一台模板计算机并捕获模板计算机映像呢? 什么是模板计算机? 对于模板计算机的 ...

  9. Unity Cinemachine Timeline 制作镜头动画

    Cinemachine是Unity官方推出的一套相机管理解决方案,配合Timeline使用可以实现电影级别的分镜镜头,下面以一个车子移动的例子简单介绍Cinemachine和Timeline的配合使用 ...

最新文章

  1. [SOSP 17] Wukong+S : 不断演化的RDF数据的亚毫秒级别的状态流查询
  2. oracle中国授权机构查询,oracle授权查询
  3. Develop内部函数,持续更新
  4. 华为5G又一黑科技曝光!中国通信技术将全球领先
  5. 文远知行2020年校招 | 领航者计划
  6. Spring boot Mybatis 整合(完整版)
  7. java long类型6_Java学习6——基本数据类型及其转换
  8. Cesium 之实现房屋模型拆解
  9. 28-地理空间数据云下载
  10. 批处理之 FOR循环
  11. linux键盘按键驱动
  12. RGMII2GMII 分析
  13. c语言中自动生成迷宫地图,C语言新案例-迷宫制作
  14. 北京大学自然辩证法概论知识点总结(2021)
  15. 阿里云推出云呼叫中心,助力企业强势打造端到端的一站式热线服务
  16. 「雅礼集训 2018 Day10」贪玩蓝月
  17. 2020.10.08丨全长转录组之参考基因组比对
  18. JAVA23种设计模式学习,源码+案例分析+类图讲解
  19. 简单说说rebuttal
  20. Linux环境变量getenv setenv unsetenv操作

热门文章

  1. 1 如何查看文件后缀名(全)
  2. 电商销售数据与分析(1):销售收入分析代码
  3. C语言中的 outtextxy(x5, y5,s);的问题
  4. 作业:学生成绩管理系统
  5. 【沟通的艺术】国王的演讲
  6. 曾经的那份记忆。已远远的离去。只留下了回忆
  7. lodop直接打印服务器的文件,常见问答 - Lodop打印控件官方网站
  8. spark大数据计算引擎原理深剖(优缺点)-spark简介
  9. 学习笔记之——VIO与VINS-Mono
  10. STM32学习——基础知识