Mass框架的Entity生成位置和每个Fragment 初始化 的问题

// 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 数据初始化成我想要的数据

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

(post deleted by author)

(post deleted by author)

谢谢你的帮助,这个是现在代码的样子 ,我想要在这个阶段初始化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);
	};
};

Did this fix the issue?

是的,但是我有其他的fragment 想要在这进行初始化我应该怎么办