演示
CinemachineFreeLook是一个第三人称视角相机插件,功能非常强大,内置了很多属性可以供开发者根据需求进行调整。
创建
首先是Cinemachine插件的导入,如果是以后的Unity版本,应该可以直接从Unity顶部菜单的Windows>Package Manager点击弹出后窗口的右侧输入Cinemachine,然后选择install,导入完成后顶部菜单会出现一个Cinemachine,点击弹出选项框然后再点击Create FreeLook Camera。
创建完成后场景内会出现一个CM FreeLook1的物体,Main Camera物体后也出现了一个图标,可以看到Main Camera身上多了一个CinemachineBrain组件。回到CM FreeLook1,点击该物体可看到挂载了一个CinemachineFreeLook的组件,下面开始介绍该组件的属性。
基础部分
Status:Live:作用未知,推测与多个虚拟摄像机的切换有关Game Window Guides:启动后点击虚拟摄像机,Game视图会出现由红色和蓝色方块组成的框,可自行拖动线条来调节下文中的Rig参数Save During Play:可在游戏运行时修改并保存参数Priority:优先度,推测与多个虚拟摄像机的切换有关Follow:跟随的目标Look At:朝向的目标,将两个参数设置为当前需要控制的对象即可完成基础的第三人称摄像机功能Standby Update:当摄像机未被启用时,该摄像机的更新频率Command Lends:公共长度,勾选取消勾选后,下方的Lens属性会出现在下文的Orbits部分Lens:
Field Of View:视野范围,视野会根据数值变大Near Clip Plane:近裁剪平面,摄像机最近的渲染位置Far Clip Plane:远裁剪平面,摄像机最远的渲染位置,摄像机会渲染处于近裁剪平面与远裁剪平面之间的物体Dutch:摄像机Z轴的旋转角度
Transitions:作用未知
Axis Control部分
这部分定义了相机运动信息的输入
Y Axis:
Value:摄像机Y轴的值,范围为0到1Max Speed:Y轴移动的最大速度Accel Time:加速时间,以秒为单位,在最大速度下加速到输入值所需的时间Decel Time:减速时间,当前玩家结束输入时,该摄像机的Y轴会在到达减速时间后停止移动Input Axis Name:默认为鼠标输入的Axis,可修改成Unity顶部菜单下Edit>Project Setting>Input
Manager>Axis下的任意一个Axis,也可置空,此时摄像机的控制只能通过代码来实现Input Axis Value:该Axis输入的值,当玩家停止输入后该值会变回0,用代码控制的话修改该值即可Invert:反转输入的方向
Y Axis Recentering:
Enable:启动后当摄像机的Y轴不在中心点时,会自动通过插值恢复到该轴的中心点(即Y轴的Value最大值为1,恢复到0.5的位置)
Wait Time:当前的Axis无输入信息持续多长时间后,开始重定位
Recentering Time:恢复到中心点所需的时间
X Axis:同上Y Axis
Orbits部分
Binding Mode:绑定模式,具体看下图(引用自【Cinemachine智能相机教程】VirtualCamera(二):Body属性)
Spline curvature:摄像机y轴的轨道,也就是连接3个红圈(官方称为Rig)的曲线的曲率,数值在0到1之间,数值越大曲率越高,效果见图
TopRig:摄像机最顶部的圈,Height是调整高度,Radius是圈的半径, 这两个属性在Scene视图内展示挺直观的,就不详细说明了
MiddleRig:摄像机中间的圈,属性同上
BottomRig:摄像机下方的圈,属性同上
另外说明一下如果需要通过代码来修改这几个Rig的两个属性的值,则可以这样写;TopRig对应的是m_Orbits[0],MiddleRig对应的是m_Orbits[1],BottomRig对应的就是m_Orbits[2]了。
cinemachineFreeLook.m_Orbits[0].m_Height = 3f;
Rig部分
Look At Override:当摄像机处于当前Rig时,对于摄像机朝向的重新定义(覆盖)这几个属性的具体用途就引用一下大智老师的这几篇文章,写得非常详细:
Body:【Cinemachine智能相机教程】VirtualCamera(二):Body属性Aim: 【Cinemachine智能相机教程】VirtualCamera(三):Aim属性Noise:【Cinemachine智能相机教程】VirtualCamera(四):Noise属性
如果想通过代码来修改Rig里的属性,可以根据Body或者Aim所对应的枚举值(Noise没试过)来获取一个组件,组件名为:Cinemachine+枚举值,比如当前Aim的枚举是Composer,则获取CinemachineComposer组件,如果需要修改TopRig下方Screen X的值就可以这样写:
cinemachineFreeLook.GetRig(0).GetCinemachineComponent<CinemachineComposer>().m_ScreenX = 0.8f;
最后补充一点,Aim的默认方式是Composer,但是在不修改任何属性的情况下摄像机的中心是角色两脚中心的位置,而这并不符合常理,所以这时候就要修改Tracked Object Offset属性:
修改前:TopRig、MiddleRig与BottomRig的Tracked Object Offset皆为(0,0,0)
修改后:此时TopRig的Tracked Object Offset为(0,1.5,0),MidedleRig与BottomRig的Tracked Object Offset皆为(0,1,0),各位可根据项目需求来进行适量调整
Extensions:
这里则是一些拓展功能了,本人只用过Cinemachine Collider,就简单介绍一下吧。这个拓展插件是给摄像机添加一个Collider,当摄像机与其他带有Collider的物体发生碰撞时,摄像机会进行相应的移动来确保依然对准Target,详细属性介绍的话就引用一下这篇文章:利用Cinemachine实现相机不穿墙效果
演示: