生成Actor

基础内容

Posted by AIaimuti on April 27, 2020


今天要做的一个功能是在指定区域内生成若干个Actor,可以用于游戏刷怪之类的。

生成Actor

生成Actor配置

BlueprintNativeEvent 需要我们做一个函数原生的实现,但是这个实现可以随时被覆盖
当在蓝图中使用时,会搜索出一个蓝图和一个事件,使用事件会覆盖函数功能,直接使用函数时有效的
TSubclassOf PawnToSpawn 创建一个ACreature的子类PawnToSpawn
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));
		}
	}	
}