【UE4 C++】 在指定区域范围内随机生成character

前言

本文章将告诉你在指定区域范围内随机生成character。

没运行一次,生成的角色位置都不一样。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

创建C++文件

右键文件夹空白区域,新建C++文件,继承Actor类。

.h文件

添加盒子组件,主要的作用在于指定创建范围。

UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
		class UBoxComponent* SpawningBox;

声明创建随机点的函数。

UFUNCTION(BlueprintPure)  
	FVector GetSpawnPoint(); 

这里与大家讲一下BlueprintPure 与我们之前看到的BlueprintCallable区别。
在这里插入图片描述
声明创建的元素的类型

UPROPERTY(EditAnywhere, BlueprintReadOnly)
		TSubclassOf<class ARole> PawnToSpawn;

我们一般定义一个物体属性的时候会直接UClass* DamageType这么去写,但是官方推荐了一个TSubclassOf<>这样写的好处是什么呢,这样写,我们的选择就变的多样化了,只要他是该类的子类,就都可以放入我们的这个属性中,也就是说以后如果我们要做一个功能,在指定位置生成不同的敌人,那么我们就可以把敌人的共同点提取出来,做一个基类,所有的敌人都继承这个基类,这样的话,我们的选择就多样化了。
对于当前这个功能,我生成的是一个角色类,然后有一个蓝图继承了他,那么我们的编辑界面就会出现:
在这里插入图片描述
声明生成角色类的函数。

UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
	void SpawnMyPawn(UClass* PawnClass, FVector const& Location);

这里出现了一个新的函数标记BlueprintNativeEvent,我们和BlueprintImplementableEvent做比较来促进我们的理解:
BlueprintImplementableEvent:在C++可以声明函数(不能定义,蓝图重写),在C++里调用该函数,蓝图重写实现该函数。

BlueprintNativeEvent:在C++可以声明和定义函数,在C++里调用该函数,蓝图重写实现该函数(蓝图可以重写或不重写C++父类函数), 但是他在cpp中实现的时候命名要按照[FunctionName]_Implementation 命名而不是 [FunctionName]。

.cpp文件

<构造函数>
添加头文件:#include "Components/BoxComponent.h"
在构造函数中把我们的盒子实例创建出来。
SpawningBox = CreateDefaultSubobject<UBoxComponent>(TEXT("SpawningBox"));

<GetSpawnPoint()>
添加头文件:#include "Kismet/KismetMathLibrary.h"
RandomPointInBoundingBox函数会根据盒子的位置和盒子的大小,在这个区域内随机生成一个位置。

FVector ASpawnVolume::GetSpawnPoint()
{
	FVector Extent = SpawningBox->GetScaledBoxExtent(); // 获得盒子的长宽高
	FVector Origin = SpawningBox->GetComponentLocation();  // 获得盒子的位置
	FVector Point = UKismetMathLibrary::RandomPointInBoundingBox(Origin, Extent); // 生成随机位置
	return Point;
}

<SpawnMyPawn实现>
添加头文件:#include "Role.h"这个头文件是你要防止的元素的类。
获得世界,然后在世界的某个位置,以某种角度放置我们的类实例。

void ASpawnVolume::SpawnMyPawn_Implementation(UClass* PawnClass, FVector const& Location)
{
	if (PawnClass) {
		UWorld* MyWorld = GetWorld();

		if (MyWorld) {
			ARole* Create = MyWorld->SpawnActor<ARole>(PawnClass, Location, FRotator(0.f));
		}
	}
}

蓝图实现

最后再蓝图中按照这样的连法即可实现在指定区域范围内生成character的功能。
在这里插入图片描述

就是开始的时候就要创建这个角色(调用SpawnMyPawn函数),角色从(PawnToSpawn)获取, 位置从GetSpawnPoint获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值