使用静态摄像机

本操作指南介绍如何使用静态摄像机来混合玩家视点。

Windows
MacOS
Linux

在此操作指南教程中,你将创建一个静态(或固定)摄像机角度,用于玩家在第三人称示例地图中Gameplay时的玩家角度,然后你将创建一个在你的角色与体积重叠时将你的视点过渡到新静态摄像机的触发器体积。完成此教程时,你可以将此处使用的流程应用到你自己的游戏中,为玩家设置固定角度。

创建静态摄像机Actor

选择实现方法:

Blueprints

C++

  1. 首先,点击 新建(New)>游戏(Games)>第三人称(Third Person)>蓝图(Blueprint) 创建名为 StaticCameras 的项目。

  2. 点击 添加/导入(Add/Import)>蓝图(Blueprints)>蓝图类(Blueprint Class),将显示 选择父类(Pick Parent Class) 菜单;点击展开全部类,然后搜索并选择 CameraActor,创建名为 BP_ExampleCameraActor 的新蓝图CameraActor类。

    选择父类菜单选择CameraActor

  3. 内容浏览器(Content Browser) 面板,将 BP_ExampleCameraActor 拖动到关卡中。

    将摄像机Actor拖放到关卡

  1. 首先,点击 新建(New)>游戏(Games)>第三方(Third Person)>C++ 创建名为 StaticCameras 的项目。

  2. 启动 C++类向导(C++ Class Wizard),勾选 显示所有类(Show All Classes) 复选框,在搜索字段中键入 CameraActor,以选择和创建名为 ExampleCameraActor 的新 摄像机Actor(Camera Actor) 类。

    新C++ Camera Actor类

  3. C++类(C++ Class) 面板中,右键点击你的 ExampleCamera,从 C++类(C++ Class) 操作下拉菜单中选择 基于ExampleCameraActor创建蓝图类(Create a Blueprint class based on ExampleCameraActor)。然后,将 BP_ExampleCameraActor 的实例拖动到关卡中。

    点击放大图片。

关卡设置

为了展示玩家摄像机和静态摄像机actor之间的视角过度,你需要设置场景。要完成此目标,你需要从第三人称模板关卡中修改某些静态网格体几何体。

  1. 首先导航到世界大纲视图面板,然后从 舞台几何体(ArenaGeometry) > 舞台(Arena) 文件夹中,按住shift选择 地板(Floor)墙6(Wall6)墙7(Wall7)墙8(Wall8)墙9(Wall9)

z 在世界大纲视图中选择地板和墙

  1. 按住Alt并点击 变换(Transform) 小工具然后拖动,创建重复的地板和墙设置。

    使用变换小工具拖动重复的地板和墙

  2. 这将创建 地板2(Floor2)墙10(Wall10)墙11(Wall11)墙12(Wall12)墙13(Wall13)

    点击放大图片。

  3. 移动新复制的静态网格体以组装下面的布局,从原始房间复制而来的新房间将出现,但没有任何内容。

    点击放大图片。

  1. 在世界大纲视图中,选择 墙9(Wall9)墙12(Wall12)(连接两个房间的墙),然后将其 X刻度(X Scale) 数值设置为 14。

    细节面板中的X刻度值

  2. 选择 墙9(Wall9)墙10(Wall10),然后使用 变换(Transform) 小工具移动它们,使它们成为房间之间的分区并具有如下所示的间隔。

    移动墙以创建分区

  3. 已完成的关卡设置看起来应该类似于下图,第二个房间通过墙上的一个开口连接到第一个房间。

    点击放大图片。

摄像机视角设置

现在你已经完成了关卡设置,可以将 BP_ExampleCameraActor 放置在关卡中,从而更好地了解在玩家在与触发器体积重叠时获得的视野。将 视口(Viewport) 锁定到摄像机Actor并进入 导航(Pilot) 模式,可以从摄像机的视点获取第一人称视角。

  1. 在关卡中选择摄像机之后,右键单击摄像机,然后从上下文菜单中选择 导航 'CameraActor'(Pilot 'CameraActor')

    上下文菜单导航CameraActor

  2. 你现在可以在按住 鼠标左键鼠标右键 的时候使用 WASD 按键移动视口。在关卡中飞翔时,摄像机的位置将随着你的移动而移动,从而让你了解摄像机在Gameplay期间获得的角度。

  3. 要解锁摄像机,点击 解锁(Unlock) 按钮。

    解锁按钮

    摄像机将留在解锁时的位置。解锁按钮旁边的图标可以用于在显示游戏内摄像机视图和关卡编辑器视图之间进行切换。

  4. 将摄像机导航到在第二个房间上俯视的位置,类似于下面的gif。

    将摄像机导航到俯视位置

  5. 已完成的摄像机场景设置看起来应该类似于下图,静态摄像机俯视新房间,而原始摄像机跟随第三人称Actor。

    点击放大图片。

创建碰撞触发器Actor

在这个示例中,触发器Actor充当了玩家摄像机视角和静态摄像机视角之间的过渡管理器,一旦玩家碰到它的碰撞盒,两种视角就会切换。

  1. 首先点击 添加/导入(Add/Import)>蓝图(Blueprints)>蓝图类(Blueprint Class),创建名为 BP_BlendTriggerVolume 的新蓝图Actor类。

  2. 双击BP_BlendTriggerVolume打开类默认设置,从 组件(Components) 选项卡点击 添加组件(Add Component) 按钮,选择 盒体碰撞(Box Collision) ,添加名为 OverlapVolume 的新 盒体组件(Box Component)

    添加新盒体碰撞组件

  3. 我的蓝图(My Blueprint) 选项卡,导航至变量类别,点击+号,选择新变量,从细节面板更改变量类型为浮点,将变量命名为CameraBlendTime。

    CameraBlendTime变量

  4. 编译和保存蓝图

    编译按钮

  5. 重新选择CameraBlendTime变量,并将其浮点值设置为1.0f

    设置变量浮点值

创建在组件开始重叠时事件

  1. 组件(Components) 选项卡选择 OverlapVolume,导航至 细节(Details) 面板,向下滚动到 事件(Events) 类别,点击 在组件开始重叠时(On Component Begin Overlap) 事件旁的 + 图标。

    选择组件开始重叠时事件

  2. 点击 On Component Begin Overlap(OverlapVolume) 节点,拖移执行引脚到事件图表,将显示 可执行文件 操作下拉菜单。搜索并选择 投射到ThirdPersonCharacter(Cast To ThirdPersonCharacter)

    可执行操作下拉菜单按钮

  3. On Component Begin Overlap 节点上,点击并拖开 其他Actor(Other Actor) 引脚,将其输入至 Cast To Third PersonCharacter 节点的 对象(Object) 引脚。

    拖开其他Actor引脚

  4. Cast To ThirdPersonCharacter 节点上,选择并拖开 作为第三人称角色(As Third Person Character) 参考引脚,并从操作下拉菜单,搜索并选择 Is Valid

    操作下拉菜单Is Valid

  5. 选择并从 Is Valid 节点的布尔返回值拖移,从操作菜单搜索并选择 Branch 节点,然后将 Cast to ThirdPersonCharacter 节点的执行引脚连接到Branch节点。

    Is Valid连接到Branch

  6. Branch 节点,点击并拖开 True 引脚,从操作菜单搜索并选择 投射到PlayerController(Cast to PlayerController)

    可执行操作Cast to PlayerController

  7. Cast To ThirdPerson Character 节点上,点击并拖开 作为第三人称角色(As Third Person Character) 引脚,并从操作菜单搜索并选择 获取控制器(Get Controller)

    操作菜单Get Controller

  8. Get Controller Node 节点上,点击并拖开 返回值(Return Value),将其连接至 Cast To PlayerController 节点的 对象(Object) 引脚。

    Get Controller返回值

  9. CastToPlayerController 节点上,拖开 作为播放器控制器(As Player Controller) 引脚,重复步骤4和步骤5中所述的 Is ValidBranch 选中操作。

    重复Is Valid and Branch

  10. 选择并拖开 Branch 节点的 True 引脚到事件图表,从操作下拉菜单搜索并选择 获取类的Actor(Get Actor Of Class)

    操作菜单Get Actor Of Class

  11. Actor类 引脚的 选择类(Select Class) 下拉菜单,搜索并选择 BP_ExampleCameraActor 类。

    选择你的Actor类

  12. 导航至你的 Cast To PlayerController 节点,点击并拖开 作为玩家控制器(As Player Controller) 引脚,从操作菜单搜索并选择 使用混合设置视图目标(Set View Target With Blend)

    操作菜单使用混合设置视图目标

  13. Get Actor of Class 节点上,点击并拖开返回值引脚,将其插入 Set View Target 节点的 新视图目标(New View Target) 输入引脚,然后连接执行引脚。

    连接节点

  14. 导航至 我的蓝图(My Blueprint) 选项卡,从 变量(Variables) 类别点击 CameraBlendTime 浮点变量并将其拖放到事件图表,从下拉菜单选择 获取CameraBlendTime(Get CameraBlendTime),获取变量引用。

    CameraBlendTime变量已添加至图表

  15. 摄像机混合时间(Camera Blend Time) 变量引脚连接到 Set View Target 节点的 混合时间(Blend Time) 引脚。

    连接节点

  16. VolumeTrigger On Component Begin Overlap逻辑应如下图所示。

    点击查看大图。

创建在组件结束重叠时事件

退出 OverlapVolume 时,在组件结束重叠时事件 将视图过渡到玩家角色的摄像机。

  1. 导航至 组件Components 选项卡,选择 盒体 组件。然后,在 细节(Details) 面板向下滚动到 事件(Events) 类别,点击 在组件结束重叠时(On Component End Overlap) 事件旁的 + 图标。

    将在组件结束重叠时事件添加到盒体组件

  2. 复制此前为 在组件开始重叠时事件 创建的逻辑,然后删除 Get All Actors Of Class 节点。

    删除Get All Actors Of Class节点

  3. Cast to ThirdPersonCharacter 节点上,从 作为ThirdPersonCharacter(As ThirdPersonCharacter) 输出引脚拖开。

    作为ThirdPersonCharacter输出引脚

  4. 将引脚连接至 Set View Target with Blend 节点的 新视图目标(New View Target) 输入引脚。

    连接节点

  5. 此逻辑将摄像机过渡回第三人称角色视图。

    点击查看大图。

完成的蓝图

BP_BlendTriggerVolume

点击查看大图。

设置重叠触发器Actor

现在你已经创建了重叠Actor,你需要将它放置到关卡中,并设置边界。

  1. 内容浏览器(Content Browser) 中,将 BP_BlendTriggerVolume 的实例拖动到关卡中。

    放置体积Actor实例

  2. BP_BlendTriggerVolume 与你的 BP_ExampleCameraActor 一同移动到空间内,从细节面板中选择盒体组件。导航到 形状(Shape) 类别,修改 盒体范围(Box Extent) X、Y和Z值,使体积适应你的空间。

    ![修改盒体范围值](InteractiveExperiences\UsingCameras\UsingAStaticCamera\Blueprints\StaticCam_Blueprint27.png)

  3. 主编辑器视图(Main Editor View) 中,点击 运行(Play) 按钮以在编辑器中运行。

  1. 使用 C++类向导(C++ Class Wizard) 新建名为BlendTriggerVolume的Actor类。

    新C++混合触发器体积类

  2. 导航至你的 BlendTriggerVolume.h 文件,在 类定义 中声明以下代码:

    protected:
    
    //Actor体积的碰撞边界
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
        class UBoxComponent* OverlapVolume;
    
        //Actor体积混合至的摄像机Actor
        UPROPERTY(EditAnywhere, BlueprintReadWrite)
        TSubclassOf<ACameraActor> CameraToFind;
    
        //摄像机过渡的混合时间
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    float CameraBlendTime; 
    
    //OverlapVolume Actor的开始和结束重叠方法
        virtual void NotifyActorBeginOverlap(AActor* OtherActor);
    
        virtual void NotifyActorEndOverlap(AActor* OtherActor);
  1. 接下来,导航至你的 BlendTriggerVolume.cpp 文件,以设置构造函数和盒体组件重叠方法。声明以下包括类库。

    #include "Components/BoxComponent.h"

    #include "StaticCamerasCharacter.h"

    #include "Camera/CameraActor.h"

    #include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"

  2. 在构造函数 ABlendTriggerVolume::ABlendTriggerVolume 中声明以下代码。

    ABlendTriggerVolume::ABlendTriggerVolume()
    {
    //创建盒体组件默认组件
    OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));
    //将盒体组件附件设置为根组件。 
    OverlapVolume->SetupAttachment(RootComponent);
    }
  3. 下一步,实现你的 NotifyActorBeginOverlapNotifyActorEndOverlap 类方法:

    void ABlendTriggerVolume::NotifyActorBeginOverlap(AActor* OtherActor){
    //执行检查,看重叠的Actor是否是第三人称玩家角色
    
    if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
        {
    
    //投射到玩家角色的玩家控制器
    
    if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
            {
                //包含已找到的摄像机Actor的数组
                TArray<AActor*> FoundActors;
    
     //效用函数,用关卡中的所有摄像机Actor填充数组
    
    UGameplayStatics::GetAllActorsOfClass(GetWorld(), CameraToFind, FoundActors);
    
    //将玩家控制器视图设置为第一个找到的CameraActor
    PlayerCharacterController->SetViewTargetWithBlend(FoundActors[0], CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
            }
        }
    
    }
    
    void ABlendTriggerVolume::NotifyActorEndOverlap(AActor* OtherActor){
        if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
    {
      if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
    {
    
    //混合到玩家角色的摄像机组件。
    PlayerCharacterController->SetViewTargetWithBlend(PlayerCharacterController->GetPawn(), CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
    }
          }
    }
  4. 编译 你的代码。

已完成代码

BlendTriggerVolume.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "BlendTriggerVolume.generated.h"

UCLASS()
class STATICCAMERAS_API ABlendTriggerVolume : public AActor
{
    GENERATED_BODY()

public:    
    // 为此Actor的属性设置默认值
    ABlendTriggerVolume();

protected:
    //Actor体积的碰撞边界
UPROPERTY(EditAnywhere, BlueprintReadWrite)
    class UBoxComponent* OverlapVolume;

    //Actor体积混合至的摄像机Actor
    UPROPERTY(EditAnywhere, BlueprintReadWrite)
    TSubclassOf<ACameraActor> CameraToFind;

    //摄像机过渡的混合时间
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta =(ClampMin = 0.0f ))
float CameraBlendTime; 

//OverlapVolume Actor的开始和结束重叠Actor方法。

    //OverlapVolume Actor的开始和结束重叠方法
    virtual void NotifyActorBeginOverlap(AActor* OtherActor);

    virtual void NotifyActorEndOverlap(AActor* OtherActor);
};

BlendTriggerVolume.cpp

#include "BlendTriggerVolume.h"
#include "Components/BoxComponent.h"
#include "StaticCamerasCharacter.h"
#include "Camera/CameraActor.h"
#include "Runtime/Engine/Classes/Kismet/GameplayStatics.h"

// 设置默认值
ABlendTriggerVolume::ABlendTriggerVolume()
{     

//创建盒体组件默认组件
OverlapVolume = CreateDefaultSubobject<UBoxComponent>(TEXT("CameraProximityVolume"));

//将盒体组件附件设置为根组件。OverlapVolume->SetupAttachment(RootComponent);

//设置CameraBlendTime
CameraBlendTime = 1.0f;

}
// 当游戏开始或重生(Spawn)时被调用

void ABlendTriggerVolume::BeginPlay()
{
Super::BeginPlay();
}

void ABlendTriggerVolume::NotifyActorBeginOverlap(AActor * OtherActor)
{

//执行检查,看重叠的Actor是否是第三人称玩家角色     

if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
{
//投射到玩家角色的玩家控制器

if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
    {        
//包含已找到的摄像机Actor的数组
TArray<AActor*> FoundActors;

 //效用函数,用关卡中的所有摄像机Actor填充数组
UGameplayStatics::GetAllActorsOfClass(GetWorld(), CameraToFind, FoundActors);

//将玩家控制器视图设置为第一个找到的CameraActor PlayerCharacterController->SetViewTargetWithBlend(FoundActors[0], CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
}
}

} 
void ABlendTriggerVolume::NotifyActorEndOverlap(AActor* OtherActor)
{
    if (AStaticCamerasCharacter* PlayerCharacterCheck = Cast<AStaticCamerasCharacter>(OtherActor))
{
  if (APlayerController* PlayerCharacterController = Cast<APlayerController>(PlayerCharacterCheck->GetController()))
{

//混合到玩家角色的摄像机组件。
PlayerCharacterController->SetViewTargetWithBlend(PlayerCharacterController->GetPawn(), CameraBlendTime, EViewTargetBlendFunction::VTBlend_Linear);
     }
 }

 }
// 每一帧都被调用
void ABlendTriggerVolume::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}

设置重叠触发器Actor

现在你已经创建了重叠Actor,你需要将它放置到关卡中,并设置边界。

  1. 首先,导航至 C++类(C++ Classes) 文件夹,右键点击 BlendTriggerVolume 类,选择 基于BlendTriggerVolume创建蓝图类(Create Blueprint Class based on BlendTriggerVolume),然后将你的 蓝图Actor(Blueprint Actor) 命名为 BP_BlendTriggerVolume

    创建蓝图类

  2. 细节(Details) 面板中,从类默认值导航到 要查找的摄像机(Camera To Find),打开下拉菜单,选择 BP_ExampleCameraActor

    查找摄像机

  3. 你可以选择更改此蓝图的默认混合时间,而不必返回源代码,或者影响其他具有相同继承父类的蓝图。

    更改默认混合时间

  4. 编译保存

    编译按钮

  5. 内容浏览器(Content Browser) 中,将 BP_BlendTriggerVolume 的实例拖动到关卡中。

    点击放大图片。

  6. BP_BlendTriggerVolume 与你的 BP_ExampleCameraActor 一同移动到空间内,从 细节(Details) 面板中选择盒体组件。导航到 形状(Shape) 类别,修改 盒体范围(Box Extent) X、Y和Z值,使体积适应你的空间。

    点击放大图片。

  7. 主编辑器视图(Main Editor View) 中,点击 运行(Play) 按钮以在编辑器中运行。

最终效果

游戏启动后,玩家可以使用 WASD 控制角色的移动。在重叠 BP_BlendTriggerVolume 时,会将摄像机视图指定到你创建并放置到关卡中的 摄像机Actor(Camera Actor),并且视图将切换到玩家控制的角色的俯拍镜头。

移动墙以创建分区

你可能还会注意到,视图是宽屏模式;在 细节(Details) 面板中为摄像机Actor取消选中 约束高宽比(Constrain Aspect Ratio) 选项可禁用此设置。

约束高宽比复选框

欢迎帮助改进虚幻引擎文档!请告诉我们该如何更好地为您服务。
填写问卷调查
取消