六一的部落格


关关难过关关过,前路漫漫亦灿灿。




Pawn移动

之前的Pawn移动, 其实是Camera组件在移动


为Pawn添加组件

GeometryPawn

  1. 静态网格体组件

    Static Mesh

  2. 摄像机组件

    Camera


根组件的选择

之前绑定StaticMesh时,将其设做根组件

现在有两种做法可供选择:

  • 将Scene组件作为根组件,将StaticMesh和Camera组件作为根组件附件

    应用到Scene组件的变换,也会应用到StaticMesh和Camera上

  • 将StaticMesh作为根组件,而Camera作为StaticMesh附件,此时,移动StaticMesh,Camera会一起移动. 反过来亦可

根组件和附件的选择,会影响组件的最终变换矩阵,其为根组件变换矩阵和附件变换矩阵的乘积


在头文件中添加前向声明

1class UCameraComponent;
2class UStaticMeshComponent;

在源文件中添加头文件

1#include "Components/StaticMeshComponent.h"
2#include "Camera/CameraComponent.h"

添加数据成员: 组件

protected

1UPROPERTY(VisibleAnywhere)
2UStaticMeshComponent *StaticMesh;
3
4UPROPERTY(VisibleAnywhere)
5UCameraComponent *Camera;

添加函数成员: 初始化组件

private

在构造函数中调用

初始化组件,并挂在根组件下

1void AGeometryPawn::InitStaticMeshAndCameraComponent()
2{
3    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMeshComponent");
4    Camera = CreateDefaultSubobject<UCameraComponent>("CameraComponent");
5
6    StaticMesh->SetupAttachment(SceneComponent);
7    Camera->SetupAttachment(GetRootComponent());
8}

实现虚函数: 了解切换Pawn时函数的调用情况

调用时输出日志

用来了解切换Pawn时,对Pawn对象的操作


使用Pawn时,调用PossessedBy

1void AGeometryPawn::PossessedBy(AController *NewController) {
2    Super::PossessedBy(NewController);
3    if (!NewController) return;
4
5    UE_LOG(LogGeometryPawn, Log, TEXT("%s possessed by %s"), *GetName(), *NewController->GetName());
6}

切换Pawn时,调用UnPossessed

1void AGeometryPawn::UnPossessed() {
2    Super::UnPossessed();
3    UE_LOG(LogGeometryPawn, Log, TEXT("%s is unpossessed"), *GetName());
4}

创建并设置基于GeometryPawn的蓝图类


创建基于GeometryPawn的蓝图类

BP_GeometryPawn_Sphere

双击打开蓝图编辑器,摄像机就是CameraComponent的表示



为StaticMesh绑定模型Sphere,并应用材质



分离StaticMesh组件和Camera组件

实际运行起来,相当于第三视角,可以看到StaticMesh的运动



可以为Camera组件添加附件

按理说是无法看到添加的附件的

  1. 选中CameraComponent


  2. Add,选择Cube作为附件


  3. 可为Cube应用材质


为Pawn添加组件



Pawn移动

之前的Pawn移动, 其实是Camera组件在移动


为Pawn添加组件

GeometryPawn

  1. 静态网格体组件

    Static Mesh

  2. 摄像机组件

    Camera


根组件的选择

之前绑定StaticMesh时,将其设做根组件

现在有两种做法可供选择:

  • 将Scene组件作为根组件,将StaticMesh和Camera组件作为根组件附件

    应用到Scene组件的变换,也会应用到StaticMesh和Camera上

  • 将StaticMesh作为根组件,而Camera作为StaticMesh附件,此时,移动StaticMesh,Camera会一起移动. 反过来亦可

根组件和附件的选择,会影响组件的最终变换矩阵,其为根组件变换矩阵和附件变换矩阵的乘积


在头文件中添加前向声明

1class UCameraComponent;
2class UStaticMeshComponent;

在源文件中添加头文件

1#include "Components/StaticMeshComponent.h"
2#include "Camera/CameraComponent.h"

添加数据成员: 组件

protected

1UPROPERTY(VisibleAnywhere)
2UStaticMeshComponent *StaticMesh;
3
4UPROPERTY(VisibleAnywhere)
5UCameraComponent *Camera;

添加函数成员: 初始化组件

private

在构造函数中调用

初始化组件,并挂在根组件下

1void AGeometryPawn::InitStaticMeshAndCameraComponent()
2{
3    StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMeshComponent");
4    Camera = CreateDefaultSubobject<UCameraComponent>("CameraComponent");
5
6    StaticMesh->SetupAttachment(SceneComponent);
7    Camera->SetupAttachment(GetRootComponent());
8}

实现虚函数: 了解切换Pawn时函数的调用情况

调用时输出日志

用来了解切换Pawn时,对Pawn对象的操作


使用Pawn时,调用PossessedBy

1void AGeometryPawn::PossessedBy(AController *NewController) {
2    Super::PossessedBy(NewController);
3    if (!NewController) return;
4
5    UE_LOG(LogGeometryPawn, Log, TEXT("%s possessed by %s"), *GetName(), *NewController->GetName());
6}

切换Pawn时,调用UnPossessed

1void AGeometryPawn::UnPossessed() {
2    Super::UnPossessed();
3    UE_LOG(LogGeometryPawn, Log, TEXT("%s is unpossessed"), *GetName());
4}

创建并设置基于GeometryPawn的蓝图类


创建基于GeometryPawn的蓝图类

BP_GeometryPawn_Sphere

双击打开蓝图编辑器,摄像机就是CameraComponent的表示



为StaticMesh绑定模型Sphere,并应用材质



分离StaticMesh组件和Camera组件

实际运行起来,相当于第三视角,可以看到StaticMesh的运动



可以为Camera组件添加附件

按理说是无法看到添加的附件的

  1. 选中CameraComponent


  2. Add,选择Cube作为附件


  3. 可为Cube应用材质