// Copyright Epic Games, Inc. All Rights Reserved. #include "Example/MassSimpleMovementTrait.h" #include "MassEntityTemplateRegistry.h" #include "Engine/World.h" #include "MassMovementFragments.h" #include "MassCommonFragments.h" #include "MassExecutionContext.h" #include "MassSimulationLOD.h" //----------------------------------------------------------------------// // UMassSimpleMovementTrait //----------------------------------------------------------------------// void UMassSimpleMovementTrait::BuildTemplate(FMassEntityTemplateBuildContext& BuildContext, const UWorld& World) const { BuildContext.AddFragment(); BuildContext.AddFragment(); BuildContext.AddTag(); } //----------------------------------------------------------------------// // UMassSimpleMovementProcessor //----------------------------------------------------------------------// UMassSimpleMovementProcessor::UMassSimpleMovementProcessor() : EntityQuery(*this) { bAutoRegisterWithProcessingPhases = true; ExecutionFlags = (int32)EProcessorExecutionFlags::AllNetModes; ExecutionOrder.ExecuteInGroup = UE::Mass::ProcessorGroupNames::Avoidance; } void UMassSimpleMovementProcessor::ConfigureQueries(const TSharedRef& EntityManager) { EntityQuery.AddRequirement(EMassFragmentAccess::ReadOnly); EntityQuery.AddRequirement(EMassFragmentAccess::ReadWrite); EntityQuery.AddTagRequirement(EMassFragmentPresence::All); EntityQuery.AddRequirement(EMassFragmentAccess::ReadOnly, EMassFragmentPresence::Optional); EntityQuery.AddChunkRequirement(EMassFragmentAccess::ReadOnly, EMassFragmentPresence::Optional); EntityQuery.SetChunkFilter(&FMassSimulationVariableTickChunkFragment::ShouldTickChunkThisFrame); } void UMassSimpleMovementProcessor::Execute(FMassEntityManager& EntityManager, FMassExecutionContext& ExecutionContext) { EntityQuery.ForEachEntityChunk(ExecutionContext, ([this](FMassExecutionContext& Context) { const TConstArrayView VelocitiesList = Context.GetFragmentView(); const TArrayView TransformsList = Context.GetMutableFragmentView(); const TConstArrayView SimVariableTickList = Context.GetFragmentView(); const bool bHasVariableTick = (SimVariableTickList.Num() > 0); const float WorldDeltaTime = Context.GetDeltaTimeSeconds(); for (FMassExecutionContext::FEntityIterator EntityIt = Context.CreateEntityIterator(); EntityIt; ++EntityIt) { const FMassVelocityFragment& Velocity = VelocitiesList[EntityIt]; FTransform& Transform = TransformsList[EntityIt].GetMutableTransform(); const float DeltaTime = bHasVariableTick ? SimVariableTickList[EntityIt].DeltaTime : WorldDeltaTime; Transform.SetTranslation(Transform.GetTranslation() + Velocity.Value * DeltaTime); } })); }