创建CameraShake资源
CameraShake配置是个蓝图类,我们选择创建BlueprintClass,父类选择CameraShakeBase即可。
参数调整
目前主要用到了
LocationAmplitudeMultiplier = 1
LocationFrequencyMultiplier = 10
RotationAmplitudeMultiplier= 1
RotationFrequencyMultiplier = 10
其他参数应该也有各自的效果
使用CameraShake
游戏内使用
主要有以下几种调用方式
- 使用PlayerController进行调用
- 给CameraActor添加组件UCameraShakeSourceComponent,调用组件函数
- 使用UGameplayStatics的静态函数,这种方法内部也是取到PlayerController,然后调用PlayerController的接口
Editor 内使用
这个Editor内使用指的是我们在开发一些工具编辑器,编辑器内部需要使用CameraShake功能。因为编辑器下一般没有PlayerController,因此我们要借助FCameraShakePreviewer* CameraShakePreviewer对视口进行抖动。这个方法可以参考在动画编辑器视口下预览摄像机晃动Camerahttps://zhuanlan.zhihu.com/p/604965454
编辑器模式下,相机抖动最终是要反馈给到Viewport的。我们可以按照如下步骤进行处理
cpp
1.声明 class FCameraShakePreviewer* CameraShakePreviewer = nullptr;
2.创建实例
CameraShakePreviewer = new FCameraShakePreviewer();
//创建的时候,绑定到对应的World
CameraShakePreviewer->Initialize(World);
//销毁的时候delete即可
3.在Tick函数调用Update函数驱动更新
CameraShakePreviewer->Update(DeltaTime, true);
4.封装相机震动接口
void YourTool::AddCameraShake(TSubclassOf<UCameraShakeBase> ShakeClass, UCameraShakeSourceComponent* ShakeSourceComponent)
{
UCameraModifier_CameraShake* const PreviewCameraShake = CameraShakePreviewer->GetCameraModifier();
FAddCameraShakeParams Params;
Params.SourceComponent = ShakeSourceComponent;
Params.Scale = 1.0;
Params.PlaySpace = ECameraShakePlaySpace::World;;
PreviewCameraShake->AddCameraShake(ShakeClass, Params);
}
5.把震动效果反馈给Viewport
我们的编辑器肯定是有视口FEditorViewportClient* EditorViewportClient
对视口的ViewModifiers进行绑定
EditorViewportClient->ViewModifiers.AddRaw(this, &YourTool::ModifyViewportClientView);
6.实现函数YourTool::ModifyViewportClientView
void YourTool::ModifyViewportClientView(FEditorViewportViewModifierParams& Params)
{
CameraShakePreviewer->ModifyView(Params);
}
7.最终调用
拿到我们要处理的相机CameraActor,调用AddCameraShake接口即可
YourToolInstance->AddCameraShake(CameraShakeClass, CameraActor->ShakeSourceComponent)
可见这种方法是通过给Camera挂接组件UCameraShakeSourceComponent,然后结合FCameraShakePreviewer传入CameraShakeBase参数是进行工作的。