目录
1. 角色跳跃
实现角色跳跃十分简单,Character类中已经有相应的函数,因此只需要在控制输入的函数中添加一行代码:
PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
2. 创建火药桶类
课程中的课后作业要求,用C++实现一个火药桶,在受击后会发生爆炸产生冲击波,并与周围的Actor产生物理交互。首先,需要创建SurExplosiveBarrel类,基类为AActor。该类包含两个关键组件:MeshComp和ForceComp,分别控制模型和爆炸的力场。UFUNCTION宏可将函数在蓝图中公开,以便开发者直接从蓝图调用或扩展函数。随后的实现部分直接参考了课程提供的源码,暂时没有理解代码中OnActorHit()的调用方式,待以后补充(该部分的内容已经补充至第12节,如果以下代码运行失败,请参考第12节的完整代码)。完整代码如下:
// SurExplosiveBarrel.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SurExplosiveBarrel.generated.h"
class UStaticMeshComponent;
class URadialForceComponent;
UCLASS()
class SURKEAUE_API ASurExplosiveBarrel : public AActor
{
GENERATED_BODY()
public:
ASurExplosiveBarrel();
protected:
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* MeshComp;
UPROPERTY(VisibleAnywhere)
URadialForceComponent* ForceComp;
UFUNCTION()
void OnActorHit();
};
// SurExplosiveBarrel.cpp
#include "SurExplosiveBarrel.h"
#include "PhysicsEngine/RadialForceComponent.h"
#include "Components/StaticMeshComponent.h"
// Sets default values
ASurExplosiveBarrel::ASurExplosiveBarrel()
{
MeshComp = CreateDefaultSubobject<UStaticMeshComponent>("MeshComp");
// UE中的“模拟物理”选项
MeshComp->SetSimulatePhysics(true);
// 等同于在UE中将“碰撞预设”设置为“PhysicsActor”
MeshComp->SetCollisionProfileName(UCollisionProfile::PhysicsActor_ProfileName);
RootComponent = MeshComp;
ForceComp = CreateDefaultSubobject<URadialForceComponent>("ForceComp");
ForceComp->SetupAttachment(MeshComp);
ForceComp->Radius = 750.0f; // 爆炸范围
ForceComp->ImpulseStrength = 700.0f; // 冲击力
ForceComp->bImpulseVelChange = true; // 忽略质量大小;见UE中ForceComp的“冲量速度变更”
}
void ASurExplosiveBarrel::OnActorHit()
{
ForceComp->FireImpulse();
}
3. 创建蓝图类
在UE中创建ExplosiveBarrel蓝图类继承自SurExplosiveBarrel,并给他分配一个网格体和材质。由于项目中没有红色火药桶的素材,于是换成了一个粉红色的圆柱体。
接下来把它拖拽进世界中,运行关卡并向它发射魔法粒子。可以发现角色和旁边的正方体(需要设置“模拟物理”打开)都被冲击波弹开了。