UE4 如何使用C++程式碼實現 在指定範圍內隨機生成同一個種類的不同物品(怪物,NPC,拾取物)的 自定義藍圖
一、引言
在遊戲世界中有特別多的物品,NPC,怪物。使用UE4中的藍圖我們可以擺放這些事務,但是如何在指定範圍內隨機生成同一個種類的不同事物呢,這就需要UE4 實現 C++自定義 藍圖功能。
二、構思
首先我們構思一下實現上訴功能,應該怎麼做。
1.想要在指定範圍內,我們需要一個範圍,這裡我用 UBoxComponent,用於指定物品或怪物的生成範圍;
2.生成的物品的種類是不同的,那麼需要定義一個模板類物件;
3.我們需要隨機生成物品,則可用陣列,通過隨機生成下標實現獲取物品的效果。
4.最重要的來了:想要動態生成物品到世界中,光靠C++程式碼是很困難的,那麼我們需要到藍圖中也去呼叫一下。也就是說C++函式實現一半功能,藍圖中呼叫該函式實現另外一半功能。
三、實現效果
如果需要拾取物藍圖,只需要在本藍圖的基礎上覆制,然後更改Actor即可。
這裡提供怪物藍圖設定預覽:
場景佈置預覽:
實際產出效果如下:
四、程式碼編寫
標頭檔案程式碼如下:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "SpawnVolume.generated.h"
UCLASS()
class MYFIRSTPROJECT_API ASpawnVolume : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ASpawnVolume();
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "SpawningBox")
class UBoxComponent* SpawningBox;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
TSubclassOf<AActor> Actor_1;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
TSubclassOf<AActor> Actor_2;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
TSubclassOf<AActor> Actor_3;
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Spawning")
TSubclassOf<AActor> Actor_4;
TArray<TSubclassOf<AActor>> SpawnArray;
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UFUNCTION(BlueprintPure,Category = "Spawning")
FVector GetSpawnPonit();
UFUNCTION(BlueprintPure, Category = "Spawning")
TSubclassOf<AActor> GetSpawnActor();
UFUNCTION(BlueprintNativeEvent,BlueprintCallable,Category = "Spawning")
void SpawnOurActor(UClass* ToSpawn, const FVector& Location);
};
App程式碼如下:
#include "SpawnVolume.h"
#include "Components/BoxComponent.h"
#include "Kismet/KismetMathLibrary.h"
#include "Engine/World.h"
#include "Critter.h"
#include "Enemy.h"
#include "AIController.h"
// Sets default values
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"));
}
// Called when the game starts or when spawned
void ASpawnVolume::BeginPlay()
{
Super::BeginPlay();
if (Actor_1) {
SpawnArray.Add(Actor_1);
}
if (Actor_2) {
SpawnArray.Add(Actor_2);
}
if (Actor_3) {
SpawnArray.Add(Actor_3);
}
if (Actor_4) {
SpawnArray.Add(Actor_4);
}
}
// Called every frame
void ASpawnVolume::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
FVector ASpawnVolume::GetSpawnPonit()
{
FVector Extent = SpawningBox->GetScaledBoxExtent();
FVector Origin = SpawningBox->GetComponentLocation();
FVector Point = UKismetMathLibrary::RandomPointInBoundingBox(Origin,Extent);
return Point;
}
void ASpawnVolume::SpawnOurActor_Implementation(UClass* ToSpawn,const FVector& Location)
{
if (ToSpawn)
{
UWorld* World = GetWorld();
FActorSpawnParameters SpawnParams;
if (World)
{
AActor* Actor = World->SpawnActor<AActor>(ToSpawn, Location, FRotator(0.f), SpawnParams);
AEnemy* Enemy = Cast<AEnemy>(Actor);
if (Enemy) {
//生成預設AI控制器
Enemy->SpawnDefaultController();
AAIController* AICont = Cast<AAIController>(Enemy->GetController());
if (AICont) {
Enemy->AIController = AICont;
}
}
}
}
}
TSubclassOf<AActor> ASpawnVolume::GetSpawnActor() {
if (SpawnArray.Num() > 0) {
int32 Selection = FMath::RandRange(0, SpawnArray.Num() - 1);
return SpawnArray[Selection];
}
else {
return nullptr;
}
}
4.藍圖呼叫:
相關文章
- 在指定範圍內生成隨機數隨機
- java生成指定範圍的隨機數Java隨機
- MATLAB中如何生成指定範圍的隨機整數向量Matlab隨機
- C語言程式生成指定範圍的不重複的隨機數C語言隨機
- 生成某個範圍的隨機數隨機
- 如何產生指定範圍的隨機數隨機
- [隨機數詳解]生成一個隨機數,生成指定範圍的隨機數及隨機陣列去重隨機陣列
- jquery簡單生成指定範圍隨機數效果jQuery隨機
- js生成一定範圍內的隨機整數JS隨機
- MATLAB中如何產生指定範圍的隨機數Matlab隨機
- 封裝不同類别範本的隨機數生成器封裝隨機
- 【SQL】獲取指定範圍內結果集的實現方法SQL
- 生成總和固定 可變範圍的隨機數隨機
- 如何在linux中用命令產生一個範圍內的隨機數?Linux隨機
- 如何生成指定分佈的隨機數隨機
- 隨機範圍小數和隨機範圍整數隨機
- java 生成一個隨機整數,範圍從 1 到 10Java隨機
- matlab 從某個範圍內隨機取出一個整數Matlab隨機
- Angular JS 自定義指令的scope範圍AngularJS
- UE4純C++實現遊戲快捷欄之物品讀取C++遊戲
- SQL Server當中生成一定範圍的隨機數SQLServer隨機
- redis如何獲取有序集合指定範圍的個數Redis
- canvas實現的隨機生成漂浮小球程式碼例項Canvas隨機
- 自定義Drawable:實現文字生成圖片
- 大規模資料儲存叢集資料存放的設計,分散式shardid的生成-如何指定範圍隨機數,分組隨機數分散式隨機
- javascript實現的生成驗證碼隨機數程式碼例項JavaScript隨機
- 八種在 Linux 上生成隨機密碼的方法Linux隨機密碼
- 使用 Carbon 獲取指定時間範圍內的日期陣列陣列
- iOS-摳圖:去除圖片中指定範圍顏色的三種方式iOS
- 一個隨機數的類c++隨機C++
- javascript生成指定位數隨機數程式碼例項JavaScript隨機
- 推送開發實戰:APP如何實現跟隨使用者不同場景,實現不同的內容推薦APP
- 智慧 Monkey 在指定執行的頁面範圍內執行方案
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- 6-1 使用函式輸出指定範圍內Fibonacci數的個數函式
- 生成k個不同的隨機數,從m到n,並輸出最大值的程式程式碼隨機
- 在寬400px,高400px的div中,使用物件的方式建立隨機小星星✨,要求每次點選div範圍內的任何地方,小星星的位置隨機出現,不得超出範圍物件隨機
- 配置dbconsole報錯:無法在指定的範圍內為以下程式分配埠