losep0
(losep0)
April 28, 2025, 3:12am
1
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "MassEntityConfigAsset.h"
#include "MassEntitySpawnDataGeneratorBase.h"
#include "MassSpawnLocationProcessor.h"
#include "MassSpawnerTypes.h"
#include "MoveToTargetProcessor.h"
#include "MassEntityConfigAsset.h"
#include "MassEntitySpawnDataGeneratorBase.h"
#include "ThisLocalSpawn.generated.h"
/**
*
*/
UCLASS()
class MASSDEMO1_API UThisLocalSpawn : public UMassEntitySpawnDataGeneratorBase
{
GENERATED_BODY()
public:
virtual void Generate(UObject& QueryOwner, TConstArrayView<FMassSpawnedEntityType> EntityTypes, int32 Count, FFinishedGeneratingSpawnDataSignature& FinishedGeneratingSpawnPointsDelegate) const override
{
const FTransform& OwnerTransform = CastChecked<AActor>(&QueryOwner)->GetTransform();
if (Count <= 0 || !OwnerTransform.IsValid())
{
FinishedGeneratingSpawnPointsDelegate.Execute(TArray<FMassEntitySpawnDataGeneratorResult>());
return;
}
TArray<FMassEntitySpawnDataGeneratorResult> Results;
//
for (int32 i = 0; i <EntityTypes.Num(); i++)
{
const FMassSpawnedEntityType& EntityType = EntityTypes[i];
const int32 EntityCount = int32(Count * EntityType.Proportion / Count);
if (EntityCount > 0)
{
FMassEntitySpawnDataGeneratorResult& Res = Results.AddDefaulted_GetRef();//生成新的实体
Res.NumEntities = Count;//要生成的数量
Res.EntityConfigIndex = i;
Res.SpawnDataProcessor = UMoveToTargetProcessor::StaticClass();
Res.SpawnData.InitializeAs<FMassTransformsSpawnData>();//初始化默认变量
FMassTransformsSpawnData& Transforms = Res.SpawnData.GetMutable<FMassTransformsSpawnData>();
Transforms.Transforms
}
}
FinishedGeneratingSpawnPointsDelegate.Execute(Results);
};
};
我没有办法把Entity 中的fragment 数据初始化成我想要的数据
FrostyJas
(FrostyJas)
April 28, 2025, 4:16am
2
Hi there @losep0
Inside your for (int32 i = 0; i < EntityTypes.Num(); i++)
loop, you have: ‘Transforms.Transforms’. But you’re missing adding transforms for your spawned entities. You need to add Count number of transforms to it, based on your Owner’s transform or your own logic.
2 Likes
losep0
(losep0)
April 28, 2025, 8:51am
5
谢谢你的帮助,这个是现在代码的样子 ,我想要在这个阶段初始化entity的其它Fragment我应该怎么做
#include "MassSpawnLocationProcessor.h"
#include "MassSpawnerTypes.h"
#include "MoveToTargetProcessor.h"
#include "MassEntityConfigAsset.h"
#include "MassEntitySpawnDataGeneratorBase.h"
#include "MoveTargetTrait.h"
#include "ThisLocalSpawn.generated.h"
/**
*
*/
UCLASS()
class MASSDEMO1_API UThisLocalSpawn : public UMassEntitySpawnDataGeneratorBase
{
GENERATED_BODY()
public:
virtual void Generate(UObject& QueryOwner, TConstArrayView<FMassSpawnedEntityType> EntityTypes, int32 Count, FFinishedGeneratingSpawnDataSignature& FinishedGeneratingSpawnPointsDelegate) const override
{
const FTransform& OwnerTransform = CastChecked<AActor>(&QueryOwner)->GetTransform();
if (Count <= 0 || !OwnerTransform.IsValid())
{
FinishedGeneratingSpawnPointsDelegate.Execute(TArray<FMassEntitySpawnDataGeneratorResult>());
return;
}
TArray<FMassEntitySpawnDataGeneratorResult> Results;
for (int32 i = 0; i <EntityTypes.Num(); i++)
{
const FMassSpawnedEntityType& EntityType = EntityTypes[i];
const int32 EntityCount = int32(Count * EntityType.Proportion);
if (EntityCount > 0)
{
FMassEntitySpawnDataGeneratorResult& Res = Results.AddDefaulted_GetRef();//生成新的实体
Res.NumEntities = EntityCount;//要生成当前种类的实体的数量
Res.EntityConfigIndex = i;
Res.SpawnDataProcessor = UMassSpawnLocationProcessor::StaticClass();
Res.SpawnData.InitializeAs<FMassTransformsSpawnData>();//初始化默认变量
FMassTransformsSpawnData& Transforms = Res.SpawnData.GetMutable<FMassTransformsSpawnData>();//申请一个引用
Transforms.Transforms.Reserve(Res.NumEntities);
int32 v = 0;
while (v<EntityCount)
{
FTransform& Transform = Transforms.Transforms.AddDefaulted_GetRef();
Transform.SetLocation(FVector(100));
v++;
}
}
}
FinishedGeneratingSpawnPointsDelegate.Execute(Results);
};
};
losep0
(losep0)
April 29, 2025, 2:19am
7
是的,但是我有其他的fragment 想要在这进行初始化我应该怎么办