JoshWindsor 发表于 2022-7-29 12:27

主流游戏相机实现(unity3d Cinemachine)

简介:

本文通过unity3d引擎和Cinemachine组件来实现主流游戏的相机设置,切换和管理的概念,习惯,基本原理,经验参数等。

(手游【战双 Like ACT Camera)


(PC游戏 【Sifu/师傅 Like ACT Camera)



<hr/>更多内容可以在 uwa 上查看:
<hr/>一【战双】相机分解和实现


A 基本相机分解
1 自由行走相机


[*]TPS相机,相机转向小于角色水平切向速度:水平行走会有旋转跟随效果
[*]手动拖动屏幕相机可以旋转。

[*]水平拖动半屏幕相机可以旋转360度,拖动旋转比率大致如此。
[*]垂直拖动屏幕相机可以旋转 ~30度,有上下限制,基于轨道。

[*]单词次击屏幕,相机会调整回角色正方向 用时 ~0.5
(图)(动图来自手游 战双)




2 锁定相机
锁定一个目标,目标在屏幕中心附近,主控角色在相机安全区域内
(图)(动图来自手游 战双)




3 特写相机
大技能特写(动图来自手游 战双)




<hr/>B 状态衔接:
图)(动图来自手游 战双)





攻击立刻进入锁定相机
拖动屏幕立刻进入自由相机
按住移动键,保持移动超过~1秒进入自由相机
相机切换有自然融合效果。
C 实现:
Cinemachine:
com.unity.cinemachine@2.6.11 稳定版
自由相机:
原本的自由相机CinemachineFreeLook    Axis由input输入,自由观看。 具有3个rigs轨道和背部spline.

   这里对CinemachineFreeLook进行修改:



[*]参数修改 Rig[] 同轨道
[*]代码修改: inputAxis => 拖屏输入:UseTouchInput, TouchInputValue 外部传值实现手动拖屏处理。取消Axis由input输入自由观看。


锁定相机:
CinemachineVirtualCamera + FramingTransposer + GroupComposer
CinemachineTargetGroup




相机切换和融合:
用权重切换相机;
融合用参数:


每个虚拟相机的位置角度都是独立计算,切换会有很多翻转和融合的边界问题。
其中 Inherit Position是继承brain中CamB的位置的选项,勾选后可以省去很多边界和位置处理问题。
不同预制相机组件有的需要重写OnTransitionFromCamera方法:

相机控制:



[*]使用权重切换相机


[*]锁定下目标距离过远和过近切换相机:


[*]锁定下保持移动超过1.5s切换相机:


[*]进入攻击状态切换为锁定相机


[*]点击和拖屏旋转相机
[*]双击矫正相机正方向,也是通过m_XAxis的值。


[*]双击矫正和自由拖动互斥:


融合参数:


D 效果展示


说明
0:00 ~ 0:06自由行走;
0:06 ~0:10 水平拖动屏幕旋转相机;
0:10 ~0:14 双击屏幕相机矫正正方向;

0:16锁定相机,攻击目标;
~ 相机切换和融合 ...

<hr/>
二【Sifu/师傅 】战斗相机部分分解与实现


Sifu 游戏战斗相机表现




(动图来自steam 游戏 sifu )
复刻部分效果,连招特写等
A 基本相机
基本行走相机和上节的类似,在部分细节上有区别。这里不过多还原。
B 状态驱动相机
为了部分技能连招的表现力和独特效果,很多游戏会用到特写相机。不限于大招,特殊连招等。不同技能的表现可能需要不同角度和位置的机位以及不同渐变,FOV等参数来表现和区分。
部分技能连招的特写相机,这里用到了Cinemachine的转态驱动相机CinemachineStateDrivenCamera

CinemachineStateDrivenCamera 需要和Animator 绑定。读取AnimationState名字来切换子相机。
其中CinemachineStateDrivenCamera有4个子特写相机。
分镜师,美术,策划可以在子特写相机设计上发挥。




子特写相机可以的位置和朝向看点等可以按照需求设定。另外也可以加上动画等。
CM vcam4 用到了Aim和看点。这里看相的是主控角色,也可以多样化看敌人等其他对象。

CM vcam5 没有设定 Body和 Aim。只用到了Transform本身的值。

主控角色的Animator的States如下:


状态切换:

相机切换用权重来实现,其中默认相机的值为10.高于10的11会替换掉当前相机。同理低于10会非激活。

C 屏幕震动效果

在需要震动效果的子相机上挂上CinemachineImpulseListener 用于监听
其中Gain是增益百分比参数默认1, 0.5是折半,2是翻倍等。

在需要产生发生震动的物体(震动源)上加上CinemachineImpulseSource,本例中是主控角色。可以是3d场景物体或者是一个骨骼节点等,也可以统一面向对象管理。


RawSingnal 信号源资源设置:
这里我们用AnimationCurve 来定义一个波形递减的效果。


调用震动方法

void doShakeIntel()
{   
    m_ImpulseSource.GenerateImpulse();
}

用在关键帧上调用相机震动效果

D 拓展延伸

类似的连招技能特写游戏有【Jump大乱斗】,【街霸5】等
【Jump大乱斗】的连招技能特写多相机切换过程较快,机位位置设置较为夸张。
相机切换可以用 Blend 的 Cut 类型进行快切。




(动图来自游戏 Jump大乱斗)

<hr/>更多内容可以在 uwa 上查看:

<hr/>
页: [1]
查看完整版本: 主流游戏相机实现(unity3d Cinemachine)