今天要做的一个功能是在指定区域内生成若干个Actor,可以用于游戏刷怪之类的。
生成Actor
生成Actor配置
BlueprintNativeEvent 需要我们做一个函数原生的实现,但是这个实现可以随时被覆盖
当在蓝图中使用时,会搜索出一个蓝图和一个事件,使用事件会覆盖函数功能,直接使用函数时有效的
TSubclassOf
BlueprintCallable 一般的可调用函数
BlueprintPrue 纯粹的蓝图函数,没有执行的输入和输出点
生成的Actor不能设置玩家为Player0,不然会出问题
//创建一个碰撞盒子
UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
class UBoxComponent * SpawningBox;
//返回碰撞盒子内一个随机的点
UFUNCTION(BlueprintPure)
FVector GetSpawnPoint();
//创建一个ACreature的子类PawnToSpawn
UPROPERTY(EditAnywhere, BlueprintReadOnly)
TSubclassOf<class ACreature> PawnToSpawn;
//BlueprintNativeEvent需要我们做一个原生的实现,但是这个实现可以随时被覆盖
//当在蓝图中使用时,会搜索出一个蓝图和一个事件,使用事件会覆盖函数功能,直接使用函数时有效的
UFUNCTION(BlueprintNativeEvent, BlueprintPure)
void SpawnMyPawn(UClass *PawnClass, FVector const&Location);
生成Actor函数实现
添加头文件:
#include “Components/BoxComponent.h”
#include “Kismet/KismetMathLibrary.h”
#include “Engine/World.h”
#include “Creature.h”
在蓝图中使用GetSpawnPoint和前面声明好的PawnToSpawn连接到spawnActor就可以完成功能
同样直接调用SpawnMyPawn函数也可以生成Actor
Spawn Emitter at Location 使用特效
右键transfrom参数,可以复制
ASpawnVolume::ASpawnVolume()
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
SpawningBox = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawningBox"));
}
FVector ASpawnVolume::GetSpawnPoint()
{
//获得盒子的长宽高
FVector Extent = SpawningBox->GetScaledBoxExtent();
//获得盒子中心点的位置
FVector Origin = SpawningBox->GetComponentLocation();
//在盒子范围内生成随机的点
FVector Point = UKismetMathLibrary::RandomPointInBoundingBox(Origin, Extent);
return Point;
}
//这个可覆盖函数实现时要在函数名后面加_Implementation
void ASpawnVolume::SpawnMyPawn_Implementation(UClass * PawnClass, FVector const & Location)
{
if (PawnClass)
{
UWorld *MyWorld = GetWorld();
if (MyWorld)
{
ACreature *Creature = MyWorld->SpawnActor<ACreature>(PawnClass, Location, FRotator(0.f));
}
}
}