我们的镜头都要像小姑娘一样温柔 - 天天风之旅镜头系统分享

发表于2015-04-29
评论1 2.1k浏览

作为一个跑酷类手游,关卡体验是项目追求的核心元素。天天风之旅和目前流行的跑酷类游戏不同的是场景丰富多样,角色运动灵活多变。为了给玩家提供流畅、舒适的游戏体验,游戏中镜头必须做到平滑、机动、轻柔、稳定,用老大的话说就是“不管角色上天入地,我们的镜头都要像小姑娘一样温柔!”。

 

镜头系统目标效果:

1. 角色要永远都在镜头内。

2. 角色进行一段跳二段跳均不引起镜头跟随。

3. 角色从滞空状态触地时跟随触地点。

4. 角色处于走跑状态下镜头跟随角色。

5. 角色运动时产生的位置瞬变和抖动不会引起镜头抖动。

6. 可以在游戏过程中变更角色在屏幕中的基准位置。

7. 可以对镜头追踪速度进行调整。

8. 可以关闭镜头控制并由外部接管镜头追踪。

9. 镜头特效:

i.          震动

ii.        跟随特定点

iii.      FOV调整

iv.      XYZ方向自定义锁定

v.        旋转

vi.      扰动贴片

vii.    子弹时间

 

接下来的总结基础规则、添加附加规则、整理规则、实现、修改规则再实现的迭代过程就不表了。

 

一、镜头基础规则

1. 角色在镜头中的基准位置:

http://km.oa.com/files/post_photo/906/211906/f4a67d6ac261c495226fa236f7580dfe.gif

 

 

X1、X2:  角色在屏幕中的基准X位置

Y1、Y2:  角色在屏幕中的基准Y位置

Z1、Z2:  角色距离相机的基准Z位置 (没有在图中标示)

Y轴向上警戒线、Y轴向下警戒线: 规定了角色在屏幕中的上下位置范围。

Z轴向内警戒线、Z轴向外警戒线: 规定了角色距离镜头的最大最小距离。

 

二、镜头基础控制

A.【Y轴】角色处于如下状态时,镜头弹性跟随角色基准Y位置

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  角色与动线发生接触,包括普通动线、墙体、滑索动线

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  角色发生墙面起跳

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  角色向下触及当前镜头视角的角色基准Y位置线

B.【Y轴】当角色触及镜头Y轴保护线时,在弹性跟随基础上叠加角色Y轴实时速度,直到发生下一次Y轴跟随策略变更时取消角色实时速度叠加

C.【Y轴】角色发生除墙体起跳带来的滞空行为时,镜头Y不跟随,在如下情况时解除不跟随:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  触发其他所有【Y轴】【Y/X】镜头跟随的状态变化

D.【Y/X】当角色处在荡绳和挂环上,替换镜头跟随目标为荡绳和挂环的垂直方向末端挂点位置,直到角色脱离后,解除替换状态

E.【Z轴】镜头弹性跟随角色Z轴基准位置

F.【Z轴】当角色触及镜头Z轴保护线时,在弹性跟随基础上叠加角色Z轴实时速度,直到角色回到基准Z位置后取消Z轴实时速度叠加

G.【X轴】当角色受到镜头Block、Trigger等导致X位置锁定偏移了基准X位置,当这种偏移解除时,镜头弹性跟随并叠加角色实时X速度其回到基准点,并Bind

H.【ALL】当基础位置参数发生改变时,立即以新的基准位置进行跟随计算

I.【配置】可配置基础控制的如下参数,这些值为宏观的全局配置值:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  基础X/Y/Z位置

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  弹性系数KX、KY、KZ

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  保护线位置

²  Y轴向上保护线

²  Y轴向下保护线

²  Z轴向里保护线

²  Z轴向外保护线

 

三、镜头Trigger控制

A.       基础镜头控制

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  角色基础X/Y/Z位置修改与重置

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  X/Y/Z轴移动锁定与解锁

B.        特殊镜头控制

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  镜头子弹时间,其中时间缩放通过曲线编辑(持续时间-缩放值曲线)

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  镜头FOV,角度通过曲线编辑(持续时间-角度曲线)

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  镜头抖动,震动频率和震动半径通过曲线编辑(持续时间-震动频率和持续时间-震动半径曲线)

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image001.gif  基础X/Y/Z位置,各自通过曲线控制,当这项控制功能被打开时,将覆盖基础镜头控制的配置

四、镜头阻挡框

A. 阻挡镜头X/Y/Z轴方向的移动,大小长度可调整,角色触碰到该框将导致死亡

B. 只有当投射位置与阻挡框有交叉时才生效

C. 从一个阻挡框跨入另一个阻挡框的范围时,镜头弹性移动到新Block位置

 

 

五、系统设计

分析了需求并总结规则演算验证OK后,就重新回头开始正式的系统设计。

系统结构图:(ps:放太大的图看不清楚,这里就只贴一下控制器相关的部分好了)

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image003.jpg

CameraConrtol: 镜头总体控制器,用于管理所有CameraAction以及镜头的阻尼追踪算法更新.可以对阻尼效果进行开关设置.

ICameraAction: 镜头动作效果实体类的基类,根据作用类型分为 位置变更、显示效果两大类。位置变更下分为 实时控制 及 追踪目标控制 两类。每个Action实体类需要实现作用优先级查询接口,对Action效果应用顺序进行控制. 例如shake  LockAxis 的优先级最高。

CameraTrigger:用于触发 CameraAction 的场景物件,派生自MonoBehaviour或Editor框架下的LevelItemBase , 必须成对出现,并在关卡编辑时保证成对触发。

 

CurveEquation: 编辑器框架下的曲线编辑功能所输出的 曲线方程实体类,可对曲线进行控制,参数记录及路径还原. 并具备编辑状态可视化功能.

CameraDampEquation: 镜头阻尼追踪方程, 可根据镜头当前运动趋势及目标点位置进行在一些参数(阻尼速度等)控制下的镜头追踪路径计算.

CameraBlock: 派生自MonoBehaviour或Editor框架下的LevelItemBase ,用于对镜头产生阻挡,并可通过trigger对其进行曲线运动控制。具备死亡判定功能。

ICameraActionSetting: 用于对各CameraAction 进行参数设定及编辑状态可视化的基类,从其上派生出各个CameraAction对应的ActionSetting实体类,实现参数设定、参数序列化反序列化、编辑状态可视化等功能。

 

CameraAction_CurveMode: 镜头曲线移动动作控制器,用于根据设定的CurveEquation对镜头进行曲线运动的实时Transform更新。

CameraAction_Shake: 镜头抖动控制器,用于根据设定参数(抖动范围,频率)对镜头Transform进行实时更新.

CameraAction_LockAxis: 用于对镜头的轴向锁定控制,可选择锁定X/Y/Z轴位置。

CameraAction_Rotate: 用于对镜头转动进行控制,可选择转动基准目标为角色或者角色所在动线.

CameraAction_FOV: 用于对镜头进行FOV效果控制。

CameraAciotn_ShootTime: 用于对镜头进行子弹时间控制。

CameraAciton_Patch:  镜头扰动贴片控制器, 属于显示效果控制。

CameraAction_RoleScreenPos: 角色屏幕位置控制器,用于控制镜头位置以使得角色处于屏幕中的固定位置。属于位置控制器, 优先级最低。

 

六、场景构成

镜头的控制结构:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image004.jpg

 

Ø  CameraWorldNode:用于在世界坐标系下追踪角色位置的节点

Ø  CameraLocalNode:在CameraWorldNode坐标系下用于挂接镜头并且通过调整自身的LocalPosition使得CameraWorldNode 处于镜头中特定的相对位置,从而使得CameraWorldNode处于设定参数所期望的角色在屏幕内的基准位置。

Ø  CameraEffectNode:用于实现镜头震动等位移特效的节点,通过调整自身的LocalPosition达到镜头震动的效果。

Ø  Camera:镜头节点,挂接了Camera脚本,用于控制Camera自身。

 

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image005.jpg

 

七、场景中的镜头控制器

(一)CameraTrigger:

策划通过在场景中摆放带碰撞框的CameraTrigger对镜头行为和参数进行控制,当角色和Trigger发生碰撞时,执行Trigger的行为对镜头产生行为的控制或改变镜头参数。

 

在镜头Trigger上使用自定义Inspector 界面脚本的方式进行参数配置,选择trigger指向的不同类型CameraAction后显示对应的设置项配置集合。

 

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image006.jpg

 

(二)CameraBlock:

策划通过摆放CameraBlock用来阻挡镜头的运动使得镜头无法越过某些区域使得场景穿帮(为了性能和效率必须尽量缩减场景)。同时,镜头阻挡用于角色掉坑检测(伤血并进行归位)。CameraBlock可以选择阻挡方向以及是否强制将镜头拉回到阻挡位置(镜头处于阻挡背面的投影范围内都将拉回到镜头正面阻挡位置)。

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image007.jpg

 

(三)镜头曲线位移控制器:

策划可以通过构造贝塞尔曲线以及控制镜头移动速度曲线来控制使得镜头沿着特定轨迹进行运动,并可以在曲线上放置CameraTrigger来控制FOV等镜头效果自由控制关卡中的一些特殊表演位置的镜头表现。

 

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image008.jpg

 

八、镜头追踪算法

(一)镜头追踪的状态变迁

通过分别控制X Y Z三个轴向上的镜头追踪状态以适应镜头追踪角色的需求。

X轴追踪状态机:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image009.jpg

Y轴追踪状态机:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image010.jpg

 

 

Z轴状态机:

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image011.jpg

 

条件定义:

1. 接触动线: 角色触及墙面、路面、滑索、荡绳、挂环 时认为是接触动线状态

2. 非墙面起跳: 平地起跳,踩怪起跳

3. 无法达到目标点: 计算完位置并设定WorldNode的位置后,由于一些规则限制导致设定后位置与设定位置不一致。

4. 角色回到基准位置: 角色位置和追踪点距离小余0.05单位时认为镜头达到了基准位置。

5. 触及保护线: 角色屏幕位置越过Y轴保护框,或者角色Z轴位置越过保护框。

 

各状态运动控制定义:

1. Stay: 镜头世界坐标节点的对应轴向不产生任何位移。

2. Bind: 镜头世界坐标节点的对应轴向直接绑定角色位置。

3. Follow: 镜头世界坐标节点的对应轴向弹性跟随角色位置,弹性系数为K,角色与跟踪点距离为L,那么弹簧弹力为N=K * L;因为模拟弹簧运动,计算中不包含任何外界因素,弹簧弹力直接应用为运动速度。那么弹簧的瞬时速度为 V=K*L;

4. SpeedFollow:镜头世界坐标节点的对应轴向跟随角色位置, 速度为角色对应轴向瞬时速度+ 当前弹性跟随的速度。 极为  V=K*L + Pv;

弹性系数K由策划配置

 

九、总结

在给力策划的通力合作下,天天风之旅的镜头从开始设计到总结规则再到开发实现都出奇的顺利,并且在镜头系统完工交付后,到目前为止没有遇上不稳定、效果不对、无法满足后续需求等情况。

 

对此总结了此次镜头系统开发的工作方法:

 

 

http://avocado.oa.com/fconv/files/201408/edd71b45f01843a24d85dde3f978a3e6.files/image012.gif

 

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引