这篇博客,主要介绍一下,在开始关卡关于摄像机动画和Matinee动画的一些制作技巧和心得。
因为之前也没有用UE4 制作过摄像机动画,因此进入UE4官方文档查找与摄像机动画有关的方法。
解析来是具体的制作过程。
- 首先在关卡中创建一个Matinee组件:
2 .在选中Matinee,在左侧Matinee的细节栏可以看到“打开Matinee”选项:双击打开编辑器:
3.在场景中添加自己想要的摄像机:
4.在相机的Depth of field 属性中为相机设置属性:
5.接来啦要将摄像机添加进Matinee的动画轨迹中,选中Camera,在Matinee面板的左下角的空白处选择Add New Camera Group,之后可以看到一个当前摄像机的轨道,包括,Movement轨道和FOVAngle轨道。
6.拉长动画轨道:按着Ctrl键用鼠标左键拖动红色三角形,可以拉长时间长度,
7.之后在0.0处,选中Movement轨道,按Entry键,可以看到生成了一个小三角。这个小三角就表示已经在此处KEY帧。
8.打开世界视图,在关卡中将摄像机摆放在自己想要的位置:,这样一个位置就确定了。接下来回到Matinee窗口,将时间快移动到2.0处,按下Entry键,在此处再次添加关键帧。
9.在世界界面中,调整2.0出摄像机的位置,可以看到生成了一条黄色轨迹曲线。这条线就是摄像机当前的轨迹。
10.利用脚本对轨迹进行修改:
UCLASS() class MYFIRSTCODE_API AAvatar : public ACharacter { GENERATED_BODY() public: AAvatar(); virtual void BeginPlay() override; // Called every frame virtual void Tick( float DeltaSeconds ) override; // Called to bind functionality to input SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; void SetupPlayerInputComponent(class UInputComponent* InputComponent) override; void MoveForward(float amount); void MoveBack(float amount); void MoveLeft(float amount); void MoveRight(float amount); void Yaw(float amount); void Pitch(float amount); };
11.之后用同样的方法,创建另外两个机位。
12.将二号机位的开始时间拖到一号机位的结束时间上,
13.在世界中,为二号机位制作一个环绕的效果。
13.三号机位雷同。
14.为了控制时间,在右侧的红色三角处,点击右键,选择Move To Longest Track Endpoint,可以使动画序列时间自动匹配上。
15.接下来就需要添加整个动画序列了,在“轨道”窗口的空白处,单击右键,添加“Add New Director Group”,会在上方出现一个DirGroup:
16.在Director轨道上KEY帧添加不同的摄像机动画,每个摄像机动画的长度可以确定,用不同的颜色长度表示不同长度的摄像机动画。
17.之后保存Matinee,此时会显示需要关闭Matinee。
18.打开关卡蓝图,让关卡开始时就播放Matinee动画。首先选中Matinee再打开关卡蓝图,此时才可以在关卡蓝图中添加一个Matinee的引用。注意一定要选择Matinee才可以。(上图是高亮了Matinee,下图是未高亮)
19.使用Set View Target with Blend 方法来进行画面的替换:
const float SmoothBlendTime = 0.25f; TimeToNextCameraChange -= DeltaTime; if (TimeToNextCameraChange <= 0.0f) { TimeToNextCameraChange += TimeBetweenCameraChanges; // Find the actor that handles control for the local player. APlayerController* OurPlayerController = UGameplayStatics::GetPlayerController(this, 0); if (OurPlayerController) { if ((OurPlayerController->GetViewTarget() != CameraOne) && (CameraOne != nullptr)) { // Cut instantly to camera one. OurPlayerController->SetViewTarget(CameraOne); } else if ((OurPlayerController->GetViewTarget() != CameraTwo) && (CameraTwo != nullptr)) { // Blend smoothly to camera two. OurPlayerController->SetViewTargetWithBlend(CameraTwo, SmoothBlendTime); } } }
20.用Play方法播放Matinee的引用:
21.连接上先前制作的开始界面,借完成了启动关卡的所有操作。因为动画长度为15s,因此使用Delay方法,停止15s再生成UI界面。