3.3 - 设置发射物的碰撞和生命周期

当前状态下,发射物:

  • 永远生存(不会从 Scene Outliner 中消失)

  • 不会和世界场景中的其他物体发生碰撞

在这步中,我们将设置发射物的碰撞和生命周期。

限制发射物的生命周期

  1. Solution Explorer 中找到 FPSProjectile 类 CPP 文件并打开 FPSProjectile.cpp

  2. 将以下代码添加到 FPSProjectile 构造函数,设置发射物的生命周期:

    // 3 秒后消亡。
    InitialLifeSpan = 3.0f;

编辑发射物的碰撞设置

虚幻引擎打包了数个预设碰撞通道。然而引擎也提供了游戏项目可使用的自定义通道。

1.打开 Project Settings 并选择 Collision,对碰撞通道进行自定义。

![](SettingCollisionChannels.png)
  1. 选择 New Object Channel... 新建碰撞通道。将新建碰撞通道命名为“Projectile”,并将 Default Response 设为 Block,然后点击 Accept

    NewChannel.png

  2. Preset 下选择 New...,将新配置也命名为“Projectile”。参考下图对碰撞预设进行设置。

    NewProfile.png

    此碰撞配置指定了发射物将被 静态 Actors动态 ActorsActors 模拟 物理载具可摧毁 Actors 阻挡。此外, 此碰撞设置还指定发射物会与 Pawns 发生重叠。

使用新碰撞通道的设置

  1. Solution Explorer 中找到 FPSProjectile 类 CPP 文件并打开 FPSProjectile.cpp

  2. FPSProjectile 构造函数中创建 CollisionComponent,然后添加以下命令行:

    CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
  3. FPSProjectile.cpp 应与以下代码相似:

    // 在 Project Settings 的 Description 页面填入版权声明。
    
    #include "FPSProject.h"
    #include "FPSProjectile.h"
    
    // 设置默认值
    AFPSProjectile::AFPSProjectile()
    {
        // 将此 actor 设为每帧调用 Tick()。不需要时可将此关闭,以提高性能。
        PrimaryActorTick.bCanEverTick = true;
    
        // 使用球体代表简单碰撞。
        CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
        CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
    
        // 设置球体的碰撞半径。
        CollisionComponent->InitSphereRadius(15.0f);
        // 将碰撞组件设为根组件。
        RootComponent = CollisionComponent;
    
        // 使用此组件驱动此发射物的运动。
        ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
        ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
        ProjectileMovementComponent->InitialSpeed = 3000.0f;
        ProjectileMovementComponent->MaxSpeed = 3000.0f;
        ProjectileMovementComponent->bRotationFollowsVelocity = true;
        ProjectileMovementComponent->bShouldBounce = true;
        ProjectileMovementComponent->Bounciness = 0.3f;
    
        // 3 秒后消亡。
        InitialLifeSpan = 3.0f;
    }
    
    // 游戏开始时或生成时调用
    void AFPSProjectile::BeginPlay()
    {
        Super::BeginPlay();
    
    }
    
    // 每帧调用
    void AFPSProjectile::Tick( float DeltaTime )
    {
        Super::Tick( DeltaTime );
    
    }
    
    // 在发射方向上设置发射物初速度的函数。
    void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
    {
        ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
    }
  4. 在 Visual Studio 中保存 FPSProjectile.cpp

  5. Solution Explorer 中找到 FPSProject

  6. 右键单击 FPSProject 并选择 Build 编译项目。

    BuildFPSProject.png