将发射物添加到游戏
添加射击操作映射
1.点击 项目设置(Project Settings)
2.点击 输入(Input)
3.点击 操作映射(Action Mappings) 旁边的+号
4.在显示的文本输入框中输入"Fire"
5.从 鼠标(Mouse) 下拉列表中选择 鼠标左键(Left Mouse Button)
添加发射物类
1.在文件(File)菜单中,选择 新建C++类...(New C++ Class...),以选择新的父类
2.选择 Actor 作为父类,然后点击 下一步(Next)
3.将新类命名为"FPSProjectile",然后点击 创建类(Create Class)
================================================
给发射物添加球体碰撞组件
1.打开 FPSProjectile.h
2.
添加SphereComponent头文件
#include "Components/SphereComponent.h"
3.添加 USphereComponent
的引用变量
// 球体碰撞组件。
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)
USphereComponent* CollisionComponent;
4.在 AFPSProjectile
构造函数中进行初始化
if(!RootComponent)
{
RootComponent = CreateDefaultSubobject<USceneComponent>(TEXT("ProjectileSceneComponent"));
}
if(!CollisionComponent)
{
// 用球体进行简单的碰撞展示。
CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));
// 设置球体的碰撞半径。
CollisionComponent->InitSphereRadius(15.0f);
// 将根组件设置为碰撞组件。
RootComponent = CollisionComponent;
}
===================================================
添加发射物移动组件
1.打开 FPSProjectile.h
2.
添加ProjectileMovementComponent头文件。
#include "GameFramework/ProjectileMovementComponent.h"
3.添加组件变量
// 发射物移动组件。
UPROPERTY(VisibleAnywhere, Category = Movement)
UProjectileMovementComponent* ProjectileMovementComponent;
4.在构造函数中进行初始化
if(!ProjectileMovementComponent)
{
// 使用此组件驱动发射物的移动。
ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
//更新组件(参数)的位置,通常是更新actor根组件的位置
ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
//发射物初始速度
ProjectileMovementComponent->InitialSpeed = 3000.0f;
//发射物最高速度
ProjectileMovementComponent->MaxSpeed = 3000.0f;
//发射物的选择在每一帧进行更新
ProjectileMovementComponent->bRotationFollowsVelocity = true;
//设置反弹
ProjectileMovementComponent->bShouldBounce = true;
//反弹系数
ProjectileMovementComponent->Bounciness = 0.3f;
//发射物重量
ProjectileMovementComponent->ProjectileGravityScale = 0.0f;
}
===========================================
设置发射物的速度
1.在FPSProjectile.h中添加以下函数声明
// 初始化射击方向上发射物速度的函数。
void FireInDirection(const FVector& ShootDirection);
2.将以下函数定义添加到 FPSProjectile.cpp
// 初始化射击方向上发射物速度的函数。
void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
{
ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
}
======================================
绑定发射输入操作
1.在 FPSCharacter.h
中添加以下函数声明
// 处理发射物射击的函数。
UFUNCTION()
void Fire();
2.要绑定发射函数,请将以下代码添加到 FPSCharacter.cpp
中的 SetupPlayerInputComponent
函数中:
PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &AFPSCharacter::Fire);
3.现在,将以下函数定义添加到 FPSCharacter.cpp
:
void AFPSCharacter::Fire()
{
}
==========================================
定义发射物的生成位置
生成 FPSProjectile
actor并实现 OnFire
函数时需要考虑两点,即:
(1)发射物的生成位置
(2)发射物对应的类(让 FPSCharacter
及其派生蓝图知道要生成哪种发射物)
1.首先确定,枪口与摄像机的相对偏移位置变量
// 枪口相对于摄像机位置的偏移。
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
FVector MuzzleOffset;
2.添加发射物类型的变量,注意这是 protect类型的
// 要生成的发射物类。
UPROPERTY(EditDefaultsOnly, Category = Projectile)
TSubclassOf<class AFPSProjectile> ProjectileClass;
===============================================
实现射击
1.在FPSCharacter.h中引入发射物的头文件
#include "FPSProjectile.h"
2.定义cpp中的发射函数
void AFPSCharacter::Fire()
{
// 试图发射发射物。
if (ProjectileClass)
{
// 获取摄像机变换。
FVector CameraLocation;
FRotator CameraRotation;
GetActorEyesViewPoint(CameraLocation, CameraRotation);
// 设置MuzzleOffset,在略靠近摄像机前生成发射物。
MuzzleOffset.Set(100.0f, 0.0f, 0.0f);
// 将MuzzleOffset从摄像机空间变换到世界空间。
FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);
// 使目标方向略向上倾斜。
FRotator MuzzleRotation = CameraRotation;
MuzzleRotation.Pitch += 10.0f;
UWorld* World = GetWorld();
if (World)
{
FActorSpawnParameters SpawnParams;
SpawnParams.Owner = this;
SpawnParams.Instigator = GetInstigator();
// 在枪口位置生成发射物。
AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);
if (Projectile)
{
// 设置发射物的初始轨迹。
FVector LaunchDirection = MuzzleRotation.Vector();
Projectile->FireInDirection(LaunchDirection);
}
}
}
}
============================================
添加发射物网格体
1.在FPSProjectile.h添加头文件
#include "Components/StaticMeshComponent.h"
2.在FPSProjectile.h添加网格体变量
// 发射物网格体
UPROPERTY(BlueprintReadWrite , Category = Projectile)
UStaticMeshComponent* ProjectileMeshComponent;
3.在构造函数中初始化
if (!ProjectileMeshComponent)
{
ProjectileMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("ProjectileMeshComponent"));
static ConstructorHelpers::FObjectFinder<UStaticMesh> CubeVisualAsset(TEXT("/Game/Food_Pack_01/Meshes/Food_Fruit_Lime_01.Food_Fruit_Lime_01"));
if (CubeVisualAsset.Succeeded())
{
ProjectileMeshComponent->SetStaticMesh(CubeVisualAsset.Object);
ProjectileMeshComponent->SetRelativeLocation(FVector(0.0f, 0.0f, 0.0f));
}
}
====================
进入蓝图文件夹,并打开BP_FPSCharacter文件
选择我们的抛射物类
测试,发射发射物时,会在世界大纲视图中看到发射物的数量不断增加,因为它们没有已定义的生命周期。
============================================
设置发射物的碰撞和生命周期
1.将以下代码添加到FPSProjectile构造函数中,以设置发射物的生命周期:
// 3 秒后删除发射物。
InitialLifeSpan = 3.0f;
2.测试,可以自定删除
编辑发射物的碰撞设置
1.要创建自定义碰撞通道,打开项目设置(Project Settings),在引擎(Engine) - 碰撞(Collision)中,展开预设(Preset)
2.在对象通道(Object Channels)中,选择 新建对象通道...(New Object Channel...),创建新碰撞通道。将新碰撞通道命名为"Projectile",确保将默认响应(Default Response)设置为阻止(Block),然后点击接受(Accept)。
3. 在预设(Preset)中选择 新建...(New...),将新配置文件命名为"Projectile"。参考以下图片来设置你的碰撞预设。然后点击"接受(Accept)"。
使用新碰撞通道的设置
1.在FPSProjectile构造函数中,将以下代码行添加到CreateDefaultSubobject下方
// 将球体的碰撞配置文件名称设置为"Projectile"。
CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));
射击有点小问题,但是大部分问题已经解决。