UE4的第一人称模板做了什么


  我们的UE4为我们提供第一人称模板来让我们进行学习和二次开发,现在我们来看一下第一人称模板都做了什么。我们在新建第一人称模板的时候可以看到UE4官方对第一人称模板的解释,如下图:


  不难看出,我们主要使用了Character来作为我们的主角,用了HUD显示我们的UI(准星)还运用了Actor的内容(生产发射物)

  新建打开我们的第一人称项目,在这里我命名为FirstProject,打开我们的Visual Studio工程,打开我们的FirstProjectCharacter,这个就是我们的主角,而移动,视野,跳跃相关内容我们不再重复介绍,与第三人称模板大同小异。我们来看在FirstProjectCharacter.h中为我们定义了什么组件。


    // 摄像机组件
    UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = "true"))
        class UCameraComponent* FirstPersonCameraComponent;
    // 人物模型组件
    UPROPERTY(VisibleDefaultsOnly, Category=Mesh)
        class USkeletalMeshComponent* Mesh1P;
    // 枪模型组件
    UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
        class USkeletalMeshComponent* FP_Gun;
    // 相对于空组件,放在枪管位置,用于生成子弹
    UPROPERTY(VisibleDefaultsOnly, Category = Mesh)
        class USceneComponent* FP_MuzzleLocation;
    
    // 移动跳跃视野转动相关内容省略......
	
    // 子弹生成位置的偏移量
    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category=Gameplay)
        FVector GunOffset;
						

  在FristProjectCharacter.cpp中的构造函数下


    AFirstProjectCharacter::AFirstProjectCharacter(){
        // 设置胶囊体的大小
        GetCapsuleComponent()->InitCapsuleSize(55.f, 96.0f);

        // 设置视野移动相关参数(详见第三人称模板的视野移动相关内容)
        BaseTurnRate = 45.f;
        BaseLookUpRate = 45.f;

        // 实例化摄像机
        FirstPersonCameraComponent = CreateDefaultSubobject<UCameraComponent>(TEXT("FirstPersonCamera"));
        // 绑定在胶囊体组件下
        FirstPersonCameraComponent->SetupAttachment(GetCapsuleComponent());
        // 位置偏移
        FirstPersonCameraComponent->SetRelativeLocation(FVector(-39.56f, 1.75f, 64.f)); 
        // 允许摄像机与Controller旋转
        FirstPersonCameraComponent->bUsePawnControlRotation = true;

        // 设置模型
        Mesh1P = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("CharacterMesh1P"));
        // 设置模型显示
        Mesh1P->SetOnlyOwnerSee(true);
        // 绑定在摄像机下
        Mesh1P->SetupAttachment(FirstPersonCameraComponent);
        // 不产生阴影
        Mesh1P->bCastDynamicShadow = false;
        // 不投射阴影上去
        Mesh1P->CastShadow = false;
        // 位置和旋转属性的设置
        Mesh1P->SetRelativeRotation(FRotator(1.9f, -19.19f, 5.2f));
        Mesh1P->SetRelativeLocation(FVector(-0.5f, -4.4f, -155.7f));

        // 设置枪模型
        FP_Gun = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("FP_Gun"));
        FP_Gun->SetOnlyOwnerSee(true);		
        FP_Gun->bCastDynamicShadow = false;
        FP_Gun->CastShadow = false;
        // 绑定在根组件下
        FP_Gun->SetupAttachment(RootComponent);

        // 实例化枪管发射标识组件
        FP_MuzzleLocation = CreateDefaultSubobject<USceneComponent>(TEXT("MuzzleLocation"));
        // 放在枪模型组件下
        FP_MuzzleLocation->SetupAttachment(FP_Gun);
        // 将这个组件移动到枪管位置
        FP_MuzzleLocation->SetRelativeLocation(FVector(0.2f, 48.4f, -10.6f));

        // 设置发射物的偏移量
        GunOffset = FVector(100.0f, 0.0f, 10.0f);
    }
						

  我们看到,他的大致思路是有一个角色的模型,枪的模型,在枪的模型下实例化一个虚的组件,在这个组件的位置生成子弹。