3.3 - 设置发射物的碰撞和生命周期
当前状态下,发射物:
永远生存(不会从 Scene Outliner 中消失)
不会和世界场景中的其他物体发生碰撞
在这步中,我们将设置发射物的碰撞和生命周期。
限制发射物的生命周期
在 Solution Explorer 中找到
FPSProjectile
类 CPP 文件并打开FPSProjectile.cpp
。将以下代码添加到
FPSProjectile
构造函数,设置发射物的生命周期:// 3 秒后消亡。 InitialLifeSpan = 3.0f;
编辑发射物的碰撞设置
虚幻引擎打包了数个预设碰撞通道。然而引擎也提供了游戏项目可使用的自定义通道。
1.打开 Project Settings 并选择 Collision,对碰撞通道进行自定义。
![](SettingCollisionChannels.png)
选择 New Object Channel... 新建碰撞通道。将新建碰撞通道命名为“Projectile”,并将 Default Response 设为 Block,然后点击 Accept。
在 Preset 下选择 New...,将新配置也命名为“Projectile”。参考下图对碰撞预设进行设置。
此碰撞配置指定了发射物将被
静态 Actors
、动态 Actors
、Actors
模拟物理
、载具
和可摧毁 Actors
阻挡。此外, 此碰撞设置还指定发射物会与Pawns
发生重叠。
使用新碰撞通道的设置
在 Solution Explorer 中找到
FPSProjectile
类 CPP 文件并打开FPSProjectile.cpp
。在
FPSProjectile
构造函数中创建CollisionComponent
,然后添加以下命令行:CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
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; }
在 Visual Studio 中保存
FPSProjectile.cpp
。在 Solution Explorer 中找到 FPSProject。
右键单击 FPSProject 并选择 Build 编译项目。