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

在以往我们可能需要通过射线检测或者碰撞检测等,然后编写一大堆的代码做一堆复杂的判断来修改我们的摄像机的位置。但是有了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相同,那么目标自身也会被当做一种障碍物,影响运算。

在许多的第三人称游戏中,我们的摄像机往往保持着一定的偏移,跟随着我们的角色。但是常常会出现的一种情况就是,当我们的角色走进室内或者靠近墙边或障碍物的时候,如果这个偏移保持不变的话,我们的摄像机就可能会跑到墙体里,或者看向角色时被墙体或障碍物所挡住。因此这种情况下我们的相机往往需要一些特殊的处理,例如修改偏移量来拉近相机与角色的距离等,来防止上述情况的出现。在以往我们可能需要通过射线检测或者碰撞检测等,然后编写一大堆的代码做一堆复杂的判断来修改我们的摄像机的位置。视频链接:https://www.bi 这个可以理解用 Cin e machine 的专属碰撞体来实现的 实现自动监测切换 首先在 Cin e machine 面板上创建一个Clearshot camera (集合) 这可以理解为一个父物体 可以吧所有虚拟镜头添加上去 然后给下面的每个虚拟镜头添加 Cin e machine coll ider 组件 这个组件就是实现检测的组件 其中...
凹面碰撞器是Unity的一个组件,它支持复杂而精确的碰撞检测和光线投射。 在Unity中,网格对网格的碰撞只在至少一个网格是凸的情况下有效。 凹面对撞机通过提供一种自动计算一组可适应任何形状的对撞机的方法,帮助克服了这一限制;凸。只需点击一下! 包括5个不同的示例场景。 统一Pro 3.5 / 4。统一5个人或专业版。只有Windows或Mac。用它构建的产品可以在任何平台上运行。
凹对撞机是一个团结,使复杂和精确的碰撞检测和raycasts组件。在Unity中,网格-网格碰撞只工作,如果至少有一个网格是凸的。 凹对撞机可以自动计算一组碰撞,可以适应任何形状提供一个方法克服这一局限;凸或不。只需点击一下! 包括5个不同的示例场景。
普通相机抖动脚本较易实现,但在使用 cin e machine 相机下,其Transform组件不可被代码修改,那么 Cin e machine 的相机抖动如何实现呢?本文结合实际项目,对实现相机抖动的三大步骤进行系统讲解: 项目地址:Hero - SouthBegonia version 2.2.9 packageManager 下载 项目背景:一款2D像素动作游戏,我们操控着Player(...
学习参考:b站Up主M_Studio(麦扣老师)的3DRPG系列教程 衔接上一篇文章《Unity使用虚拟相机实现人物跟踪移动》,最后实现的镜头效果的对比图如下: 设置虚拟相机之前,相机是固定的。可以看到人物移动距离相机越来越远。 在使用虚拟相机后虽然实现了相机跟随移动,但是在人物移动的过程中只能看到前方固定的视角。 使用 cin e machine 的FreeLookCamera实现自由移动镜头 1.新建FreeLook相机 在原有的Demo上进行更改,关闭原有的虚拟相机,新建一个自由的相机,可以实现常见的第三
这篇文章参考的是unity官方的视频教程,主要是做一个记录,如有侵权则删,其实unity官方挺多视频都挺皮的,也是个看教程的地方23333 参考链接: 1.《Unity实现尼尔机械纪元运镜设计》 -unity官方 https://www.bilibili.com/video/av43069305 2.《[Unity小技巧] ProBuilder - 在Unity中建模》-SwickSu https...
1.重新进行Unity布局,右上角哪里重新进行Layout布局,一般可以恢复Scene视角相机的初始化 2.Scene视角顶部信息栏有一个 摄像头 图标,点开,就是可以进行Scene摄像机的控制,把Field of View调小就可以调整穿模现象了。 怎么办,可能是因为 一开始设置的bound的Polygon Coll ider 2D的边界设置过小,以至于被摄像机给碰撞了。 调整初始的 Polygon Coll ider 2D的边界。 再用代码进行设置的时候,一定不能小于摄像机的长宽。
Cin e machine virtual Camera有以下组件: 1. Cin e machine Virtual Camera:用于创建虚拟相机,可以控制相机的位置、旋转、视野等参数。 2. Cin e machine Transposer:用于相机跟随目标的平移和旋转。 3. Cin e machine Composer:用于相机的平滑跟随目标,可以自动调整相机的位置和旋转。 4. Cin e machine Noise:用于添加相机的抖动效果,可以模拟相机的震动或者风吹等效果。 5. Cin e machine Framing Transposer:用于相机的平移和旋转,可以自动调整相机的位置和旋转,以保证目标在相机视野内。 6. Cin e machine Coll ider :用于相机的避让 障碍物 ,可以自动调整相机的位置和旋转,以避免相机撞到 障碍物 。 以上是 Cin e machine virtual Camera的组件及其作用。