快速了解Unity2017新功能:Cinemachine(3)
简介
上一篇文章我们更深入地认识了Cinemachine,并且动手实践创建了一个基础的
镜头跟随效果,以及一个2D游戏常见的场景和镜头效果。今天我们再来了解一下ClearShot
一图流
温故知新
Cinemachine的基础概念这里就不再复述了,不清楚的兄弟可以查看我的第一篇文章
今天我们来说说ClearShot。他这有什么用呢?试想一个在3D游戏中,我们常会遇到这样的情况,玩家从室外移动到室内, 这时候室内的观察视野就没有野外宽阔了, 我们能看到的内容也会发生变化。如果使用ClearShot就能很轻松地达到这种效果。
实践
使用ClearShot,我们可以快速地达到如下的效果。
-
创建一个移动的Cube,和一个固定的wall,如图,cube有一个动画,会向前移动一段距离,穿过wall后再出来
-
通过Cinemachine->Create ClearShot Camera,创建一个ClearShot VirtualCamera,命名为CM ClearShot1。
-
通过Cinemachine->Cerate Virtual Camera, 创建一个Virutal Camera,命名为lookTheUp。
-
将lookTheUp VCam放到CM ClearShot1下,变成clearshot的子物体,这时候会发现clearshot下已经有一个Vcam了, 将这个Vcam改名为lookTheRight
树形结构如图
-
设置lookTheRight,在cube移动的时候跟随cube,而且注释这cube前进方向的右侧, 设置lookTheUp,在cube移动的时候跟随cube,注释这cube前进方向的上方。
-
选择CM ClearShot1,修改两个Child VirtualCamera的优先级,设置lookTheRight为12, lookTheUp为11。 这个时候我们会看到一个警告,提示lookTheUp没有添加ColliderExtention。
-
为lookTheUp添加ColliderExtention
Play,Enjoy It。
我们可以看到,barin的初始状态由lookTheRight控制,当VCam lookTheRight无法观察到cube的时候,brain会自动选择lookTheUp来控制摄像机。
ClearShot会他的ChildVirtualCamera中选择最优的一个VirtualCamera来控制摄像机,而别这些ChildVirtualCamera都需要有ColliderExtention。
Randomize Choice
ClearShot里还有一个属性是Randmize Choice,通过查看源码,我们会明白,勾选后我们的ClearShot会从ChildVirtualCamera中随机选择一个VCam来 控制摄像机。当然他的条件也是很严格的,需要所有的ChildVirtualCamera有相同的Priority,还有相同的ShotQuality。
private ICinemachineCamera ChooseCurrentCamera(Vector3 worldUp, float deltaTime)
{
//not our bussiness this time...
if (LiveChild != null && !LiveChild.VirtualCameraGameObject.activeSelf)
LiveChild = null;
ICinemachineCamera best = LiveChild;
for (int i = 0; i < childCameras.Length; ++i)
{
CinemachineVirtualCameraBase vcam = childCameras[i];
if (vcam != null && vcam.VirtualCameraGameObject.activeInHierarchy)
{
// Choose the first in the list that is better than the current
if (best == null
|| vcam.State.ShotQuality > best.State.ShotQuality
|| (vcam.State.ShotQuality == best.State.ShotQuality && vcam.Priority > best.Priority)
|| (m_RandomizeChoice && mRandomizeNow && (ICinemachineCamera)vcam != LiveChild
&& vcam.State.ShotQuality == best.State.ShotQuality
&& vcam.Priority == best.Priority))
{
best = vcam;
}
}
}
mRandomizeNow = false;
float now = Time.time;
if (mActivationTime != 0)
{
// Is it active now?
if (LiveChild == best)
{
// Yes, cancel any pending
mPendingActivationTime = 0;
mPendingCamera = null;
return best;
}
}
//not our bussiness this time...
}
而代码中ShotQuality就是ColliderExtention会处理的值。
查看Randmoize Choice效果的步骤:
-
隐藏我们的wall
-
将lookTheUp和lookTheRight的Priority都修改为11
-
勾选Randomize Choice
Play
每次运行,都会随机使用一个VCamera来控制摄像机。
结尾
大家在实践的过程中有遇到什么问题,可以提出来,我很乐意和大家一起分享。