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.藍圖呼叫:
相關文章
- 在指定範圍內生成隨機數隨機
- MATLAB中如何生成指定範圍的隨機整數向量Matlab隨機
- C語言程式生成指定範圍的不重複的隨機數C語言隨機
- 如何產生指定範圍的隨機數隨機
- 生成某個範圍的隨機數隨機
- js生成一定範圍內的隨機整數JS隨機
- 封裝不同類别範本的隨機數生成器封裝隨機
- 隨機生成一個指定長度的驗證碼隨機
- 如何生成指定分佈的隨機數隨機
- 隨機範圍小數和隨機範圍整數隨機
- matlab 從某個範圍內隨機取出一個整數Matlab隨機
- java 生成一個隨機整數,範圍從 1 到 10Java隨機
- Angular JS 自定義指令的scope範圍AngularJS
- 6-1 使用函式輸出指定範圍內Fibonacci數的個數函式
- 從java內建類和自定義類比較Comparable介面和Comparator介面實現排序的不同Java排序
- SQL Server當中生成一定範圍的隨機數SQLServer隨機
- 使用 Carbon 獲取指定時間範圍內的日期陣列陣列
- 智慧 Monkey 在指定執行的頁面範圍內執行方案
- 一個隨機數的類c++隨機C++
- SpringBoot應用使用自定義的ApplicationContext實現類Spring BootAPPContext
- UE4純C++實現遊戲快捷欄之物品讀取C++遊戲
- 基於KD樹、包圍盒與RayCast(射線投射)實現物體拾取的示例程式碼框架AST框架
- C語言——使用函式輸出指定範圍內的Fibonacci數C語言函式
- 推送開發實戰:APP如何實現跟隨使用者不同場景,實現不同的內容推薦APP
- 在寬400px,高400px的div中,使用物件的方式建立隨機小星星✨,要求每次點選div範圍內的任何地方,小星星的位置隨機出現,不得超出範圍物件隨機
- JVM自定義類載入器在程式碼擴充套件性的實踐JVM套件
- 生成指定區間的隨機小數隨機
- 以下是一個使用 C++ 和 OpenGL 實現滑鼠拾取三角網格的簡單程式碼示例C++
- 使用Math類生成隨機數隨機
- Ardupilot實現同一套程式碼支援不同的飛控板原理
- Java隨機生成圖片與HTML表單中的驗證碼實現Java隨機HTML
- 自定義實現Complex類
- 6-3 使用函式輸出指定範圍內的完數 (20分)函式
- JS實現檢查給定時間範圍是否在每天的某個時間段內JS
- 如何使用同一BluetoothGatt連線不同的android應用程式在相同的裝置上?Android
- div拖動範圍限定在指定元素內
- HMS Core地理圍欄能力助你實現指定範圍人群的精準訊息推送
- PFMEA如何定義範圍?