本文整理汇总了C++中AActor类的典型用法代码示例。如果您正苦于以下问题:C++ AActor类的具体用法?C++ AActor怎么用?C++ AActor使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了AActor类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ClearAnswer
EBTNodeResult::Type UBTTask_WaitAnswer::ExecuteTask(UBehaviorTreeComponent& OwnerComp, uint8* NodeMemory)
{
ClearAnswer();
EBTNodeResult::Type NodeResult = !bAnswerDone ? EBTNodeResult::InProgress : NodeResult = EBTNodeResult::Succeeded;
TimerCount = Timer;
AActor* OwnerActor = OwnerComp.GetOwner();
if (!DialogueWidget.IsNone())
{
FName WidgetKeyName = DialogueWidget.SelectedKeyName;
BlackboardComp = OwnerComp.GetBlackboardComponent();
Widget = Cast<UUserWidget>(BlackboardComp->GetValueAsObject(WidgetKeyName));
WidgetComp = Cast<UWidgetComponent>(BlackboardComp->GetValueAsObject(WidgetKeyName));
UDialogueButton* FirstButton = nullptr;
if (!Widget && !WidgetComp)
{
#if WITH_EDITOR
FMessageLog("PIE").Error()
->AddToken(FTextToken::Create(LOCTEXT("InvalidWidgetKey", "Invalid key for Dialogue Widget in ")))
->AddToken(FUObjectToken::Create((UObject*)OwnerComp.GetCurrentTree()));
#endif
return EBTNodeResult::Failed;
}
if (WidgetComp)
{
Widget = CreateWidget<UUserWidget>(GetWorld(), WidgetComp->GetWidgetClass());
PlayerController = WidgetComp->GetUserWidgetObject()->GetOwningPlayer();
bIsUserWidget = false;
}
else
{
bIsUserWidget = true;
PlayerController = Widget->GetOwningPlayer();
}
if (Widget && Widget->IsInViewport())
{
Widget->RemoveFromParent();
}
if (!Widget)
{
NodeResult = EBTNodeResult::Failed;
}
else
{
WidgetTree = Widget->WidgetTree;
UWidget* DialogueQuestionsSlot = WidgetTree->FindWidget(DialogueQuestionsSlotName);
UPanelWidget* Panel = Cast<UPanelWidget>(DialogueQuestionsSlot);
if (Panel)
{
TArray<UWidget*> Buttons;
UDialogueButton* SampleButton = nullptr;
UTextBlock* SampleTextBlock = nullptr;
WidgetTree->GetChildWidgets(DialogueQuestionsSlot, Buttons);
for (auto& elem : Buttons)
{
UDialogueButton* Button = Cast<UDialogueButton>(elem);
if (Button)
{
SampleButton = Button;
WidgetTree->RemoveWidget(elem);
}
UTextBlock* TextBlock = Cast<UTextBlock>(elem);
if (TextBlock)
{
SampleTextBlock = TextBlock;
WidgetTree->RemoveWidget(elem);
}
}
if (SampleButton != nullptr && SampleTextBlock != nullptr)
{
const UBTNode* BTNode = GetParentNode();
const UBTCompositeNode* CBTNode = Cast<UBTCompositeNode>(BTNode);
Panel->SetVisibility(ESlateVisibility::Visible);
if (CBTNode)
{
int32 ButtonNumber = 0;
for (int32 Index = 0; Index != CBTNode->Children.Num(); ++Index)
{
auto& Child = CBTNode->Children[Index];
UBTComposite_Question* Question = Cast<UBTComposite_Question>(Child.ChildComposite);
bool bDecoratorOk = CBTNode->DoDecoratorsAllowExecution(OwnerComp, OwnerComp.GetActiveInstanceIdx(), Index);
if(Question)
{
Question->bCanExecute = false;
Question->bSelected = false;
}
if (
Question
&& Question->Children.Num() > 0
&& Question->GetVisibility(PlayerController)
&& Question->bVisible
&& bDecoratorOk
)
{
Question->bCanExecute = true;
UDialogueButton *NewSampleButton = NewObject<UDialogueButton>(this, NAME_None, SampleButton->GetFlags(), SampleButton);
//.........这里部分代码省略.........
示例2: GetSelectedActors
void UUnrealEdEngine::UpdatePivotLocationForSelection( bool bOnChange )
{
// Pick a new common pivot, or not.
AActor* SingleActor = nullptr;
USceneComponent* SingleComponent = nullptr;
if (GetSelectedComponentCount() > 0)
{
for (FSelectedEditableComponentIterator It(*GetSelectedComponents()); It; ++It)
{
UActorComponent* Component = CastChecked<UActorComponent>(*It);
AActor* ComponentOwner = Component->GetOwner();
if (ComponentOwner != nullptr)
{
auto SelectedActors = GetSelectedActors();
const bool bIsOwnerSelected = SelectedActors->IsSelected(ComponentOwner);
check(bIsOwnerSelected);
if (ComponentOwner->GetWorld() == GWorld)
{
SingleActor = ComponentOwner;
if (Component->IsA<USceneComponent>())
{
SingleComponent = CastChecked<USceneComponent>(Component);
}
const bool IsTemplate = ComponentOwner->IsTemplate();
const bool LevelLocked = !FLevelUtils::IsLevelLocked(ComponentOwner->GetLevel());
check(IsTemplate || LevelLocked);
}
}
}
}
else
{
for (FSelectionIterator It(GetSelectedActorIterator()); It; ++It)
{
AActor* Actor = static_cast<AActor*>(*It);
checkSlow(Actor->IsA(AActor::StaticClass()));
if (Actor->GetWorld() == GWorld)
{
const bool IsTemplate = Actor->IsTemplate();
const bool LevelLocked = !FLevelUtils::IsLevelLocked(Actor->GetLevel());
check(IsTemplate || LevelLocked);
SingleActor = Actor;
}
}
}
if (SingleComponent != NULL)
{
SetPivot(SingleComponent->GetComponentLocation(), false, true);
}
else if( SingleActor != NULL )
{
// For geometry mode use current pivot location as it's set to selected face, not actor
FEditorModeTools& Tools = GLevelEditorModeTools();
if( Tools.IsModeActive(FBuiltinEditorModes::EM_Geometry) == false || bOnChange == true )
{
// Set pivot point to the actor's location
FVector PivotPoint = SingleActor->GetActorLocation();
// If grouping is active, see if this actor is part of a locked group and use that pivot instead
if(GEditor->bGroupingActive)
{
AGroupActor* ActorGroupRoot = AGroupActor::GetRootForActor(SingleActor, true, true);
if(ActorGroupRoot)
{
PivotPoint = ActorGroupRoot->GetActorLocation();
}
}
SetPivot( PivotPoint, false, true );
}
}
else
{
ResetPivot();
}
}
示例3: FindTargets
void UAblTargetingBox::FindTargets(UAblAbilityContext& Context) const
{
AActor* SourceActor = m_Location.GetSourceActor(Context);
check(SourceActor);
UWorld* World = SourceActor->GetWorld();
FTransform QueryTransform;
if (IsUsingAsync() && UAbleSettings::IsAsyncEnabled())
{
// Check if we have a valid Async handle already.
if (!Context.HasValidAsyncHandle())
{
FCollisionShape BoxShape = FCollisionShape::MakeBox(m_HalfExtents);
m_Location.GetTransform(Context, QueryTransform);
// Push our query out by our half extents so we aren't centered in the box.
FQuat Rotation = QueryTransform.GetRotation();
FVector HalfExtentsOffset = Rotation.GetForwardVector() * m_HalfExtents.X;
QueryTransform *= FTransform(HalfExtentsOffset);
FTraceHandle AsyncHandle = World->AsyncOverlapByChannel(QueryTransform.GetLocation(), QueryTransform.GetRotation(), GetCollisionChannel(), BoxShape);
Context.SetAsyncHandle(AsyncHandle);
}
else // Poll and see if our query is done, if so - process it.
{
FOverlapDatum Datum;
if (World->QueryOverlapData(Context.GetAsyncHandle(), Datum))
{
ProcessResults(Context, Datum.OutOverlaps);
FTraceHandle Empty;
Context.SetAsyncHandle(Empty); // Reset our handle.
}
return;
}
}
else // Normal Sync Query
{
FCollisionShape BoxShape = FCollisionShape::MakeBox(m_HalfExtents);
m_Location.GetTransform(Context, QueryTransform);
// Push our query out by our half extents so we aren't centered in the box.
FQuat Rotation = QueryTransform.GetRotation();
FVector HalfExtentsOffset = Rotation.GetForwardVector() * m_HalfExtents.X;
QueryTransform *= FTransform(HalfExtentsOffset);
TArray<FOverlapResult> Results;
if (World->OverlapMultiByChannel(Results, QueryTransform.GetLocation(), QueryTransform.GetRotation(), GetCollisionChannel(), BoxShape))
{
ProcessResults(Context, Results);
}
}
#if !UE_BUILD_SHIPPING
if (FAblAbilityDebug::ShouldDrawQueries())
{
// Nope, go ahead and fire off our Async query.
FVector AlignedBox = GetAlignedBox(Context, QueryTransform);
FAblAbilityDebug::DrawBoxQuery(World, QueryTransform, AlignedBox);
}
#endif // UE_BUILD_SHIPPING
}
示例4: HandleStart
//.........这里部分代码省略.........
WaveInstance->RadioFilterVolumeThreshold *= ParseParams.InteriorVolumeMultiplier;
}
bAlwaysPlay = ActiveSound.bAlwaysPlay || SoundClassProperties->bAlwaysPlay;
}
else
{
WaveInstance->VoiceCenterChannelVolume = 0.f;
WaveInstance->RadioFilterVolume = 0.f;
WaveInstance->RadioFilterVolumeThreshold = 0.f;
WaveInstance->StereoBleed = 0.f;
WaveInstance->LFEBleed = 0.f;
WaveInstance->bEQFilterApplied = ActiveSound.bEQFilterApplied;
WaveInstance->bIsUISound = ActiveSound.bIsUISound;
WaveInstance->bIsMusic = ActiveSound.bIsMusic;
WaveInstance->bReverb = ActiveSound.bReverb;
WaveInstance->bCenterChannelOnly = ActiveSound.bCenterChannelOnly;
bAlwaysPlay = ActiveSound.bAlwaysPlay;
}
// If set to bAlwaysPlay, increase the current sound's priority scale by 10x. This will still result in a possible 0-priority output if the sound has 0 actual volume
if (bAlwaysPlay)
{
WaveInstance->Priority = MAX_FLT;
}
else
{
WaveInstance->Priority = ParseParams.Priority;
}
WaveInstance->Location = ParseParams.Transform.GetTranslation();
WaveInstance->bIsStarted = true;
WaveInstance->bAlreadyNotifiedHook = false;
WaveInstance->bUseSpatialization = ParseParams.bUseSpatialization;
WaveInstance->SpatializationAlgorithm = ParseParams.SpatializationAlgorithm;
WaveInstance->WaveData = this;
WaveInstance->NotifyBufferFinishedHooks = ParseParams.NotifyBufferFinishedHooks;
WaveInstance->LoopingMode = ((bLooping || ParseParams.bLooping) ? LOOP_Forever : LOOP_Never);
WaveInstance->bIsPaused = ParseParams.bIsPaused;
if (AudioDevice->IsHRTFEnabledForAll() && ParseParams.SpatializationAlgorithm == SPATIALIZATION_Default)
{
WaveInstance->SpatializationAlgorithm = SPATIALIZATION_HRTF;
}
else
{
WaveInstance->SpatializationAlgorithm = ParseParams.SpatializationAlgorithm;
}
// Only append to the wave instances list if we're virtual (always append) or we're audible (non-zero volume)
if (WaveInstance->GetVolume() > KINDA_SMALL_NUMBER || (bVirtualizeWhenSilent && AudioDevice->VirtualSoundsEnabled()))
{
WaveInstances.Add(WaveInstance);
}
// We're still alive.
ActiveSound.bFinished = false;
// Sanity check
if( NumChannels > 2 && WaveInstance->bUseSpatialization && !WaveInstance->bReportedSpatializationWarning)
{
static TSet<USoundWave*> ReportedSounds;
if (!ReportedSounds.Contains(this))
{
FString SoundWarningInfo = FString::Printf(TEXT("Spatialisation on stereo and multichannel sounds is not supported. SoundWave: %s"), *GetName());
if (ActiveSound.GetSound() != this)
{
SoundWarningInfo += FString::Printf(TEXT(" SoundCue: %s"), *ActiveSound.GetSound()->GetName());
}
#if !NO_LOGGING
const uint64 AudioComponentID = ActiveSound.GetAudioComponentID();
if (AudioComponentID > 0)
{
FAudioThread::RunCommandOnGameThread([AudioComponentID, SoundWarningInfo]()
{
if (UAudioComponent* AudioComponent = UAudioComponent::GetAudioComponentFromID(AudioComponentID))
{
AActor* SoundOwner = AudioComponent->GetOwner();
UE_LOG(LogAudio, Warning, TEXT( "%s Actor: %s AudioComponent: %s" ), *SoundWarningInfo, (SoundOwner ? *SoundOwner->GetName() : TEXT("None")), *AudioComponent->GetName() );
}
else
{
UE_LOG(LogAudio, Warning, TEXT("%s"), *SoundWarningInfo );
}
});
}
else
{
UE_LOG(LogAudio, Warning, TEXT("%s"), *SoundWarningInfo );
}
#endif
ReportedSounds.Add(this);
}
WaveInstance->bReportedSpatializationWarning = true;
}
}
}
示例5: P_ClearAllNetIds
void NetDemo::readSnapshotData(byte *buf, size_t length)
{
byte cid = consoleplayer_id;
byte did = displayplayer_id;
P_ClearAllNetIds();
// Remove all players
players.clear();
// Remove all actors
TThinkerIterator<AActor> iterator;
AActor *mo;
while ( (mo = iterator.Next() ) )
mo->Destroy();
gameaction = ga_nothing;
FLZOMemFile memfile;
length = 0;
memfile.Open(buf); // open for reading
FArchive arc(memfile);
// Read the server cvars
byte vars[4096], *vars_p;
vars_p = vars;
size_t len = arc.ReadCount ();
arc.Read(vars, len);
cvar_t::C_ReadCVars(&vars_p);
std::string mapname;
bool intermission;
arc >> mapname;
arc >> intermission;
G_SerializeSnapshots(arc);
P_SerializeRNGState(arc);
P_SerializeACSDefereds(arc);
// Read the status of flags in CTF
for (int i = 0; i < NUMFLAGS; i++)
arc >> CTFdata[i];
// Read team points
for (int i = 0; i < NUMTEAMS; i++)
arc >> TEAMpoints[i];
arc >> level.time;
for (int i = 0; i < NUM_WORLDVARS; i++)
arc >> ACS_WorldVars[i];
for (int i = 0; i < NUM_GLOBALVARS; i++)
arc >> ACS_GlobalVars[i];
netgame = multiplayer = true;
// load a base level
savegamerestore = true; // Use the player actors in the savegame
serverside = false;
G_InitNew(mapname.c_str());
displayplayer_id = consoleplayer_id = 1;
savegamerestore = false;
// read consistancy marker
byte check;
arc >> check;
arc.Close();
if (check != 0x1d)
error("Bad snapshot");
consoleplayer_id = cid;
// try to restore display player
player_t *disp = &idplayer(did);
if (validplayer(*disp) && disp->ingame() && !disp->spectator)
displayplayer_id = did;
else
displayplayer_id = cid;
// restore player colors
for (size_t i = 0; i < players.size(); i++)
R_BuildPlayerTranslation(players[i].id, players[i].userinfo.color);
// Link the CTF flag actors to CTFdata[i].actor
TThinkerIterator<AActor> flagiterator;
while ( (mo = flagiterator.Next() ) )
{
if (mo->type == MT_BDWN || mo->type == MT_BCAR)
CTFdata[it_blueflag].actor = mo->ptr();
if (mo->type == MT_RDWN || mo->type == MT_RCAR)
CTFdata[it_redflag].actor = mo->ptr();
}
// Make sure the status bar is displayed correctly
ST_Start();
//.........这里部分代码省略.........
示例6: check
/**
* Removes the actor from its level's actor list and generally cleans up the engine's internal state.
* What this function does not do, but is handled via garbage collection instead, is remove references
* to this actor from all other actors, and kill the actor's resources. This function is set up so that
* no problems occur even if the actor is being destroyed inside its recursion stack.
*
* @param ThisActor Actor to remove.
* @param bNetForce [opt] Ignored unless called during play. Default is false.
* @param bShouldModifyLevel [opt] If true, Modify() the level before removing the actor. Default is true.
* @return true if destroy, false if actor couldn't be destroyed.
*/
bool UWorld::DestroyActor( AActor* ThisActor, bool bNetForce, bool bShouldModifyLevel )
{
check(ThisActor);
check(ThisActor->IsValidLowLevel());
//UE_LOG(LogSpawn, Log, "Destroy %s", *ThisActor->GetClass()->GetName() );
if (ThisActor->GetWorld() == NULL)
{
UE_LOG(LogSpawn, Warning, TEXT("Destroying %s, which doesn't have a valid world pointer"), *ThisActor->GetPathName());
}
// If already on list to be deleted, pretend the call was successful.
// We don't want recursive calls to trigger destruction notifications multiple times.
if (ThisActor->IsPendingKillPending())
{
return true;
}
// In-game deletion rules.
if( IsGameWorld() )
{
// Never destroy the world settings actor. This used to be enforced by bNoDelete and is actually needed for
// seamless travel and network games.
if (GetWorldSettings() == ThisActor)
{
return false;
}
// Can't kill if wrong role.
if( ThisActor->Role!=ROLE_Authority && !bNetForce && !ThisActor->bNetTemporary )
{
return false;
}
// Don't destroy player actors.
APlayerController* PC = Cast<APlayerController>(ThisActor);
if ( PC )
{
UNetConnection* C = Cast<UNetConnection>(PC->Player);
if( C )
{
if( C->Channels[0] && C->State!=USOCK_Closed )
{
C->bPendingDestroy = true;
C->Channels[0]->Close();
}
return false;
}
}
}
else
{
ThisActor->Modify();
}
// Prevent recursion
//FMarkActorIsBeingDestroyed MarkActorIsBeingDestroyed(ThisActor);
// Notify the texture streaming manager about the destruction of this actor.
IStreamingManager::Get().NotifyActorDestroyed( ThisActor );
// Tell this actor it's about to be destroyed.
ThisActor->Destroyed();
// Detach this actor's children
TArray<AActor*> AttachedActors;
ThisActor->GetAttachedActors(AttachedActors);
if (AttachedActors.Num() > 0)
{
TInlineComponentArray<USceneComponent*> SceneComponents;
ThisActor->GetComponents(SceneComponents);
for (TArray< AActor* >::TConstIterator AttachedActorIt(AttachedActors); AttachedActorIt; ++AttachedActorIt)
{
AActor* ChildActor = *AttachedActorIt;
if (ChildActor != NULL)
{
for (auto SceneCompIter = SceneComponents.CreateIterator(); SceneCompIter; ++SceneCompIter)
{
ChildActor->DetachSceneComponentsFromParent(*SceneCompIter, true);
}
#if WITH_EDITOR
if( GIsEditor )
{
GEngine->BroadcastLevelActorDetached(ChildActor, ThisActor);
}
#endif
}
//.........这里部分代码省略.........
示例7: check
USceneComponent* USCS_Node::GetParentComponentTemplate(UBlueprint* InBlueprint) const
{
USceneComponent* ParentComponentTemplate = NULL;
if(ParentComponentOrVariableName != NAME_None)
{
check(InBlueprint != NULL && InBlueprint->GeneratedClass != NULL);
// If the parent component template is found in the 'Components' array of the CDO (i.e. native)
if(bIsParentComponentNative)
{
// Access the Blueprint CDO
AActor* CDO = InBlueprint->GeneratedClass->GetDefaultObject<AActor>();
if(CDO != NULL)
{
// Find the component template in the CDO that matches the specified name
TInlineComponentArray<USceneComponent*> Components;
CDO->GetComponents(Components);
for(auto CompIt = Components.CreateIterator(); CompIt; ++CompIt)
{
USceneComponent* CompTemplate = *CompIt;
if(CompTemplate->GetFName() == ParentComponentOrVariableName)
{
// Found a match; this is our parent, we're done
ParentComponentTemplate = CompTemplate;
break;
}
}
}
}
// Otherwise the parent component template is found in a parent Blueprint's SCS tree (i.e. non-native)
else
{
// Get the Blueprint hierarchy
TArray<UBlueprint*> ParentBPStack;
UBlueprint::GetBlueprintHierarchyFromClass(InBlueprint->GeneratedClass, ParentBPStack);
// Find the parent Blueprint in the hierarchy
for(int32 StackIndex = ParentBPStack.Num() - 1; StackIndex > 0; --StackIndex)
{
UBlueprint* ParentBlueprint = ParentBPStack[StackIndex];
if(ParentBlueprint != NULL
&& ParentBlueprint->SimpleConstructionScript != NULL
&& ParentBlueprint->GeneratedClass->GetFName() == ParentComponentOwnerClassName)
{
// Find the SCS node with a variable name that matches the specified name
TArray<USCS_Node*> ParentSCSNodes = ParentBlueprint->SimpleConstructionScript->GetAllNodes();
for(int32 ParentNodeIndex = 0; ParentNodeIndex < ParentSCSNodes.Num(); ++ParentNodeIndex)
{
USceneComponent* CompTemplate = Cast<USceneComponent>(ParentSCSNodes[ParentNodeIndex]->ComponentTemplate);
if(CompTemplate != NULL && ParentSCSNodes[ParentNodeIndex]->VariableName == ParentComponentOrVariableName)
{
// Found a match; this is our parent, we're done
ParentComponentTemplate = CompTemplate;
break;
}
}
}
}
}
}
return ParentComponentTemplate;
}
示例8: DefaultDirection
void UParticleModuleVelocityCone::Render3DPreview(FParticleEmitterInstance* Owner, const FSceneView* View,FPrimitiveDrawInterface* PDI)
{
#if WITH_EDITOR
float ConeMaxAngle = 0.0f;
float ConeMinAngle = 0.0f;
Angle.GetOutRange(ConeMinAngle, ConeMaxAngle);
float ConeMaxVelocity = 0.0f;
float ConeMinVelocity = 0.0f;
Velocity.GetOutRange(ConeMinVelocity, ConeMaxVelocity);
float MaxLifetime = 0.0f;
TArray<UParticleModule*>& Modules = Owner->SpriteTemplate->GetCurrentLODLevel(Owner)->Modules;
for (int32 ModuleIndex = 0; ModuleIndex < Modules.Num(); ModuleIndex++)
{
UParticleModuleLifetimeBase* LifetimeMod = Cast<UParticleModuleLifetimeBase>(Modules[ModuleIndex]);
if (LifetimeMod != NULL)
{
MaxLifetime = LifetimeMod->GetMaxLifetime();
break;
}
}
const int32 ConeSides = 16;
const float ConeRadius = ConeMaxVelocity * MaxLifetime;
// Calculate direction transform
const FVector DefaultDirection(0.0f, 0.0f, 1.0f);
const FVector ForwardDirection = (Direction != FVector::ZeroVector)? Direction.GetSafeNormal(): DefaultDirection;
FVector UpDirection(0.0f, 0.0f, 1.0f);
FVector RightDirection(1.0f, 0.0f, 0.0f);
if ((ForwardDirection != UpDirection) && (-ForwardDirection != UpDirection))
{
RightDirection = UpDirection ^ ForwardDirection;
UpDirection = ForwardDirection ^ RightDirection;
}
else
{
UpDirection = ForwardDirection ^ RightDirection;
RightDirection = UpDirection ^ ForwardDirection;
}
FMatrix DirectionRotation;
DirectionRotation.SetIdentity();
DirectionRotation.SetAxis(0, RightDirection.GetSafeNormal());
DirectionRotation.SetAxis(1, UpDirection.GetSafeNormal());
DirectionRotation.SetAxis(2, ForwardDirection);
// Calculate the owning actor's scale and rotation
UParticleLODLevel* LODLevel = Owner->SpriteTemplate->GetCurrentLODLevel(Owner);
check(LODLevel);
FVector OwnerScale(1.0f);
FMatrix OwnerRotation(FMatrix::Identity);
FVector LocalToWorldOrigin(0.0f);
FMatrix LocalToWorld(FMatrix::Identity);
if (Owner->Component)
{
AActor* Actor = Owner->Component->GetOwner();
if (Actor)
{
if (bApplyOwnerScale == true)
{
OwnerScale = Owner->Component->ComponentToWorld.GetScale3D();
}
OwnerRotation = FQuatRotationMatrix(Actor->GetActorQuat());
}
LocalToWorldOrigin = Owner->Component->ComponentToWorld.GetLocation();
LocalToWorld = Owner->Component->ComponentToWorld.ToMatrixWithScale().RemoveTranslation();
LocalToWorld.RemoveScaling();
}
FMatrix Transform;
Transform.SetIdentity();
// DrawWireCone() draws a cone down the X axis, but this cone's default direction is down Z
const FRotationMatrix XToZRotation(FRotator((int32)(HALF_PI * 10430), 0, 0));
Transform *= XToZRotation;
// Apply scale
Transform.SetAxis(0, Transform.GetScaledAxis( EAxis::X ) * OwnerScale.X);
Transform.SetAxis(1, Transform.GetScaledAxis( EAxis::Y ) * OwnerScale.Y);
Transform.SetAxis(2, Transform.GetScaledAxis( EAxis::Z ) * OwnerScale.Z);
// Apply direction transform
Transform *= DirectionRotation;
// Transform according to world and local space flags
if (!LODLevel->RequiredModule->bUseLocalSpace && !bInWorldSpace)
{
Transform *= LocalToWorld;
}
else if (LODLevel->RequiredModule->bUseLocalSpace && bInWorldSpace)
{
Transform *= OwnerRotation;
Transform *= LocalToWorld.InverseFast();
}
else if (!bInWorldSpace)
{
Transform *= OwnerRotation;
//.........这里部分代码省略.........
示例9: QUICK_SCOPE_CYCLE_COUNTER
void UInterpToMovementComponent::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
QUICK_SCOPE_CYCLE_COUNTER(STAT_InterpToMovementComponent_TickComponent);
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
// skip if don't want component updated when not rendered or updated component can't move
if (!UpdatedComponent || ShouldSkipUpdate(DeltaTime))
{
return;
}
AActor* ActorOwner = UpdatedComponent->GetOwner();
if (!ActorOwner || !CheckStillInWorld())
{
return;
}
if (UpdatedComponent->IsSimulatingPhysics())
{
return;
}
if((bStopped == true ) || ( ActorOwner->IsPendingKill() ) )
{
return;
}
if( ControlPoints.Num()== 0 )
{
return;
}
// This will update any control points coordinates that are linked to actors.
UpdateControlPoints(false);
float RemainingTime = DeltaTime;
int32 NumBounces = 0;
int32 Iterations = 0;
FHitResult Hit(1.f);
FVector WaitPos = FVector::ZeroVector;
if (bIsWaiting == true)
{
WaitPos = UpdatedComponent->GetComponentLocation();
}
while (RemainingTime >= MIN_TICK_TIME && (Iterations < MaxSimulationIterations) && !ActorOwner->IsPendingKill() && UpdatedComponent)
{
Iterations++;
const float TimeTick = ShouldUseSubStepping() ? GetSimulationTimeStep(RemainingTime, Iterations) : RemainingTime;
RemainingTime -= TimeTick;
// Calculate the current time with this tick iteration
float Time = FMath::Clamp(CurrentTime + ((DeltaTime*TimeMultiplier)*CurrentDirection),0.0f,1.0f);
FVector MoveDelta = ComputeMoveDelta(Time);
// Update the rotation on the spline if required
FRotator CurrentRotation = UpdatedComponent->GetComponentRotation();
// Move the component
if ((bPauseOnImpact == false ) && (BehaviourType != EInterpToBehaviourType::OneShot))
{
// If we can bounce, we are allowed to move out of penetrations, so use SafeMoveUpdatedComponent which does that automatically.
SafeMoveUpdatedComponent(MoveDelta, CurrentRotation, true, Hit);
}
else
{
// If we can't bounce, then we shouldn't adjust if initially penetrating, because that should be a blocking hit that causes a hit event and stop simulation.
TGuardValue<EMoveComponentFlags> ScopedFlagRestore(MoveComponentFlags, MoveComponentFlags | MOVECOMP_NeverIgnoreBlockingOverlaps);
MoveUpdatedComponent(MoveDelta, CurrentRotation, true, &Hit);
}
//DrawDebugPoint(GetWorld(), UpdatedComponent->GetComponentLocation(), 16, FColor::White,true,5.0f);
// If we hit a trigger that destroyed us, abort.
if (ActorOwner->IsPendingKill() || !UpdatedComponent)
{
return;
}
// Handle hit result after movement
if (!Hit.bBlockingHit)
{
// If we were 'waiting' were not any more - broadcast we are off again
if( bIsWaiting == true )
{
OnWaitEndDelegate.Broadcast(Hit, Time);
bIsWaiting = false;
}
else
{
CalculateNewTime(CurrentTime, TimeTick, Hit, true, bStopped);
if (bStopped == true)
{
return;
}
}
}
else
{
if (HandleHitWall(Hit, TimeTick, MoveDelta))
{
break;
}
//.........这里部分代码省略.........
示例10: GetClass
void AMatineeActor::PostNetReceive()
{
Super::PostNetReceive();
if (MatineeData != NULL)
{
TArray<AActor*> ControlledActors;
// Build a list of actors controlled by this matinee actor
for( int32 InfoIndex = 0; InfoIndex < GroupActorInfos.Num(); ++InfoIndex )
{
const FInterpGroupActorInfo& Info = GroupActorInfos[ InfoIndex ];
for (int32 ActorIndex = 0; ActorIndex < Info.Actors.Num(); ++ActorIndex )
{
AActor* Actor = Info.Actors[ ActorIndex ];
if (Actor != NULL)
{
ControlledActors.Add( Actor );
}
}
}
// if we just received the matinee action, set 'saved' values to default so we make sure to apply previously received values
if (SavedInterpData == NULL)
{
AMatineeActor* Default = GetClass()->GetDefaultObject<AMatineeActor>();
SavedbIsPlaying = Default->bIsPlaying;
SavedPosition = Default->InterpPosition;
SavedbReversePlayback = Default->bReversePlayback;
}
// apply bReversePlayback
if (SavedbReversePlayback!= bReversePlayback)
{
bReversePlayback = SavedbReversePlayback;
if (SavedbIsPlaying && bIsPlaying)
{
// notify actors that something has changed
for (int32 ActorIndex = 0; ActorIndex < ControlledActors.Num(); ++ActorIndex )
{
IMatineeInterface * IMI = InterfaceCast<IMatineeInterface>(ControlledActors[ActorIndex]);
if (IMI)
{
IMI->InterpolationChanged(this);
}
}
}
}
// start up interpolation, if necessary
if (!SavedbIsPlaying && (bIsPlaying || InterpPosition != SavedPosition))
{
InitInterp();
// if we're playing forward, call Play() to process any special properties on InterpAction that may affect the meaning of 'Position' (bNoResetOnRewind, etc)
if (!bReversePlayback)
{
Play();
}
// find affected actors and set their ControllingMatineeActor
// @warning: this code requires the linked actors to be static object references (i.e., some other Kismet action can't be assigning them)
// this might not work for AI pawns
for (int32 ActorIndex = 0; ActorIndex < ControlledActors.Num(); ++ActorIndex )
{
AActor* Actor = ControlledActors[ActorIndex];
UInterpGroupInst * GrInst = FindGroupInst(Actor);
if (Actor != NULL && !Actor->IsPendingKill() && GrInst != NULL)
{
Actor->AddControllingMatineeActor(*this);
// fire an event if we're really playing (and not just starting it up to do a position update)
if (bIsPlaying)
{
IMatineeInterface * IMI = InterfaceCast<IMatineeInterface>(Actor);
if (IMI)
{
IMI->InterpolationStarted(this);
}
}
}
}
}
// if we received a different current position
if (InterpPosition != SavedPosition)
{
//@hack: negate fade tracks if we're updating a stopped matinee
// the right fix is probably to pass bJump=true to UpdateInterp() when (!bIsPlaying && !SavedbIsPlaying),
// but that may have lots of other side effects I don't have time to test right now
TArray<FSavedFadeState> SavedFadeStates;
if (!bIsPlaying && !SavedbIsPlaying && MatineeData != NULL)
{
for (FLocalPlayerIterator It(GEngine, GetWorld()); It; ++It)
{
if (It->PlayerController != NULL && It->PlayerController->PlayerCameraManager != NULL)
{
new(SavedFadeStates)FSavedFadeState(It->PlayerController->PlayerCameraManager);
}
//.........这里部分代码省略.........
示例11: OnTaskStart
void UAblRayCastQueryTask::OnTaskStart(const TWeakObjectPtr<const UAblAbilityContext>& Context) const
{
Super::OnTaskStart(Context);
AActor* SourceActor = m_QueryLocation.GetSourceActor(*Context.Get());
check(SourceActor);
UWorld* World = SourceActor->GetWorld();
FTransform QueryTransform;
m_QueryLocation.GetTransform(*Context.Get(), QueryTransform);
const FVector RayStart = QueryTransform.GetLocation();
const FVector RayEnd = RayStart + QueryTransform.GetRotation().GetForwardVector() * m_Length;
if (m_UseAsyncQuery && UAbleSettings::IsAsyncEnabled())
{
UAblRayCastQueryTaskScratchPad* ScratchPad = Cast<UAblRayCastQueryTaskScratchPad>(Context->GetScratchPadForTask(this));
check(ScratchPad);
if (m_OnlyReturnBlockingHit)
{
ScratchPad->AsyncHandle = World->AsyncLineTraceByChannel(EAsyncTraceType::Single, RayStart, RayEnd, m_CollisionChannel);
}
else
{
ScratchPad->AsyncHandle = World->AsyncLineTraceByChannel(EAsyncTraceType::Multi, RayStart, RayEnd, m_CollisionChannel);
}
}
else
{
TArray<FHitResult> HitResults;
FHitResult TraceResult;
if (m_OnlyReturnBlockingHit)
{
if (World->LineTraceSingleByChannel(TraceResult, RayStart, RayEnd, m_CollisionChannel))
{
HitResults.Add(TraceResult);
}
}
else
{
World->LineTraceMultiByChannel(HitResults, RayStart, RayEnd, m_CollisionChannel);
}
#if !(UE_BUILD_SHIPPING)
if (IsVerbose())
{
PrintVerbose(FString::Printf(TEXT("Raycast found %d results."), HitResults.Num()));
}
#endif
if (HitResults.Num())
{
#if !(UE_BUILD_SHIPPING)
if (IsVerbose())
{
// Quick distance print help to see if we hit ourselves.
float DistanceToBlocker = HitResults[HitResults.Num() - 1].Distance;
PrintVerbose(FString::Printf(TEXT("Raycast blocking hit distance: %4.2f."), DistanceToBlocker));
}
#endif
if (m_CopyResultsToContext)
{
#if !(UE_BUILD_SHIPPING)
if (IsVerbose())
{
PrintVerbose(FString::Printf(TEXT("Copying %d results into Context."), HitResults.Num()));
}
#endif
CopyResultsToContext(HitResults, Context);
}
if (m_FireEvent)
{
#if !(UE_BUILD_SHIPPING)
if (IsVerbose())
{
PrintVerbose(FString::Printf(TEXT("Firing Raycast Event %s with %d results."), *m_Name.ToString(), HitResults.Num()));
}
#endif
Context->GetAbility()->OnRaycastEvent(Context.Get(), m_Name, HitResults);
}
}
}
#if !UE_BUILD_SHIPPING
if (FAblAbilityDebug::ShouldDrawQueries())
{
FAblAbilityDebug::DrawRaycastQuery(World, QueryTransform, m_Length);
}
#endif
}
示例12: BuildSelectedActorInfo
FSelectedActorInfo BuildSelectedActorInfo( const TArray<AActor*>& SelectedActors)
{
FSelectedActorInfo ActorInfo;
if( SelectedActors.Num() > 0 )
{
// Get the class type of the first actor.
AActor* FirstActor = SelectedActors[0];
if( FirstActor && !FirstActor->HasAnyFlags( RF_ClassDefaultObject ) )
{
UClass* FirstClass = FirstActor->GetClass();
UObject* FirstArchetype = FirstActor->GetArchetype();
ActorInfo.bAllSelectedAreBrushes = Cast< ABrush >( FirstActor ) != NULL;
ActorInfo.SelectionClass = FirstClass;
// Compare all actor types with the baseline.
for ( int32 ActorIndex = 0; ActorIndex < SelectedActors.Num(); ++ActorIndex )
{
AActor* CurrentActor = SelectedActors[ ActorIndex ];
if( CurrentActor->HasAnyFlags( RF_ClassDefaultObject ) )
{
continue;
}
ABrush* Brush = Cast< ABrush >( CurrentActor );
if( !Brush)
{
ActorInfo.bAllSelectedAreBrushes = false;
}
else
{
if( !ActorInfo.bHaveBuilderBrush )
{
ActorInfo.bHaveBuilderBrush = FActorEditorUtils::IsABuilderBrush(Brush);
}
ActorInfo.bHaveBrush |= true;
ActorInfo.bHaveBSPBrush |= (!Brush->IsVolumeBrush());
ActorInfo.bHaveVolume |= Brush->IsVolumeBrush();
}
UClass* CurrentClass = CurrentActor->GetClass();
if( FirstClass != CurrentClass )
{
ActorInfo.bAllSelectedActorsOfSameType = false;
ActorInfo.SelectionClass = NULL;
FirstClass = NULL;
}
else
{
ActorInfo.SelectionClass = CurrentActor->GetClass();
}
++ActorInfo.NumSelected;
if( ActorInfo.bAllSelectedActorsBelongToCurrentLevel )
{
if( !CurrentActor->GetOuter()->IsA(ULevel::StaticClass()) || !CurrentActor->GetLevel()->IsCurrentLevel() )
{
ActorInfo.bAllSelectedActorsBelongToCurrentLevel = false;
}
}
if( ActorInfo.bAllSelectedActorsBelongToSameWorld )
{
if ( !ActorInfo.SharedWorld )
{
ActorInfo.SharedWorld = CurrentActor->GetWorld();
check(ActorInfo.SharedWorld);
}
else
{
if( ActorInfo.SharedWorld != CurrentActor->GetWorld() )
{
ActorInfo.bAllSelectedActorsBelongToCurrentLevel = false;
ActorInfo.SharedWorld = NULL;
}
}
}
// To prevent move to other level for Landscape if its components are distributed in streaming levels
if (CurrentActor->IsA(ALandscape::StaticClass()))
{
ALandscape* Landscape = CastChecked<ALandscape>(CurrentActor);
if (!Landscape || !Landscape->HasAllComponent())
{
if( !ActorInfo.bAllSelectedActorsBelongToCurrentLevel )
{
ActorInfo.bAllSelectedActorsBelongToCurrentLevel = true;
}
}
}
if ( ActorInfo.bSelectedActorsBelongToSameLevel )
{
ULevel* ActorLevel = CurrentActor->GetOuter()->IsA(ULevel::StaticClass()) ? CurrentActor->GetLevel() : NULL;
if ( !ActorInfo.SharedLevel )
{
// This is the first selected actor we've encountered.
//.........这里部分代码省略.........
示例13: PrivateAddActor
/**
* Creates an actor using the specified factory.
*
* Does nothing if ActorClass is NULL.
*/
static AActor* PrivateAddActor( UObject* Asset, UActorFactory* Factory, bool SelectActor = true, EObjectFlags ObjectFlags = RF_Transactional, const FName Name = NAME_None )
{
if (!Factory)
{
return nullptr;
}
AActor* Actor = NULL;
AActor* NewActorTemplate = Factory->GetDefaultActor( Asset );
if ( !NewActorTemplate )
{
return nullptr;
}
// For Brushes/Volumes, use the default brush as the template rather than the factory default actor
if (NewActorTemplate->IsA(ABrush::StaticClass()) && GWorld->GetDefaultBrush() != nullptr)
{
NewActorTemplate = GWorld->GetDefaultBrush();
}
const FSnappedPositioningData PositioningData = FSnappedPositioningData(GCurrentLevelEditingViewportClient, GEditor->ClickLocation, GEditor->ClickPlane)
.UseFactory(Factory)
.UseStartTransform(NewActorTemplate->GetTransform())
.UsePlacementExtent(NewActorTemplate->GetPlacementExtent());
const FTransform ActorTransform = FActorPositioning::GetSnappedSurfaceAlignedTransform(PositioningData);
// Do not fade snapping indicators over time if the viewport is not realtime
bool bClearImmediately = !GCurrentLevelEditingViewportClient || !GCurrentLevelEditingViewportClient->IsRealtime();
FSnappingUtils::ClearSnappingHelpers( bClearImmediately );
ULevel* DesiredLevel = GWorld->GetCurrentLevel();
// Don't spawn the actor if the current level is locked.
if ( FLevelUtils::IsLevelLocked(DesiredLevel) )
{
FNotificationInfo Info( NSLOCTEXT("UnrealEd", "Error_OperationDisallowedOnLockedLevel", "The requested operation could not be completed because the level is locked.") );
Info.ExpireDuration = 3.0f;
FSlateNotificationManager::Get().AddNotification(Info);
return nullptr;
}
{
FScopedTransaction Transaction( NSLOCTEXT("UnrealEd", "CreateActor", "Create Actor") );
if ( !(ObjectFlags & RF_Transactional) )
{
Transaction.Cancel();
}
// Create the actor.
Actor = Factory->CreateActor( Asset, DesiredLevel, ActorTransform, ObjectFlags, Name );
if(Actor)
{
if ( SelectActor )
{
GEditor->SelectNone( false, true );
GEditor->SelectActor( Actor, true, true );
}
Actor->InvalidateLightingCache();
Actor->PostEditChange();
}
}
GEditor->RedrawLevelEditingViewports();
if ( Actor )
{
Actor->MarkPackageDirty();
ULevel::LevelDirtiedEvent.Broadcast();
}
return Actor;
}
示例14: NSLOCTEXT
bool FMeshMergingTool::RunMerge(const FString& PackageName)
{
IMeshUtilities& MeshUtilities = FModuleManager::Get().LoadModuleChecked<IMeshUtilities>("MeshUtilities");
USelection* SelectedActors = GEditor->GetSelectedActors();
TArray<AActor*> Actors;
TArray<ULevel*> UniqueLevels;
for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter)
{
AActor* Actor = Cast<AActor>(*Iter);
if (Actor)
{
Actors.Add(Actor);
UniqueLevels.AddUnique(Actor->GetLevel());
}
}
// This restriction is only for replacement of selected actors with merged mesh actor
if (UniqueLevels.Num() > 1 && bReplaceSourceActors)
{
FText Message = NSLOCTEXT("UnrealEd", "FailedToMergeActorsSublevels_Msg", "The selected actors should be in the same level");
OpenMsgDlgInt(EAppMsgType::Ok, Message, NSLOCTEXT("UnrealEd", "FailedToMergeActors_Title", "Unable to merge actors"));
return false;
}
int32 TargetMeshLOD = bExportSpecificLOD ? ExportLODIndex : INDEX_NONE;
FVector MergedActorLocation;
TArray<UObject*> AssetsToSync;
// Merge...
{
FScopedSlowTask SlowTask(0, LOCTEXT("MergingActorsSlowTask", "Merging actors..."));
SlowTask.MakeDialog();
MeshUtilities.MergeActors(Actors, MergingSettings, NULL, PackageName, TargetMeshLOD, AssetsToSync, MergedActorLocation);
}
if (AssetsToSync.Num())
{
FAssetRegistryModule& AssetRegistry = FModuleManager::Get().LoadModuleChecked<FAssetRegistryModule>("AssetRegistry");
int32 AssetCount = AssetsToSync.Num();
for (int32 AssetIndex = 0; AssetIndex < AssetCount; AssetIndex++)
{
AssetRegistry.AssetCreated(AssetsToSync[AssetIndex]);
GEditor->BroadcastObjectReimported(AssetsToSync[AssetIndex]);
}
//Also notify the content browser that the new assets exists
FContentBrowserModule& ContentBrowserModule = FModuleManager::Get().LoadModuleChecked<FContentBrowserModule>("ContentBrowser");
ContentBrowserModule.Get().SyncBrowserToAssets(AssetsToSync, true);
// Place new mesh in the world
if (bReplaceSourceActors)
{
UStaticMesh* MergedMesh = nullptr;
if (AssetsToSync.FindItemByClass(&MergedMesh))
{
const FScopedTransaction Transaction(LOCTEXT("PlaceMergedActor", "Place Merged Actor"));
UniqueLevels[0]->Modify();
UWorld* World = UniqueLevels[0]->OwningWorld;
FActorSpawnParameters Params;
Params.OverrideLevel = UniqueLevels[0];
FRotator MergedActorRotation(ForceInit);
AStaticMeshActor* MergedActor = World->SpawnActor<AStaticMeshActor>(MergedActorLocation, MergedActorRotation, Params);
MergedActor->GetStaticMeshComponent()->StaticMesh = MergedMesh;
MergedActor->SetActorLabel(AssetsToSync[0]->GetName());
// Remove source actors
for (AActor* Actor : Actors)
{
Actor->Destroy();
}
}
}
}
return true;
}
示例15: sizeof
void UDemoNetDriver::TickDemoRecord( float DeltaSeconds )
{
if ( ClientConnections.Num() == 0 )
{
return;
}
if ( FileAr == NULL )
{
return;
}
DemoDeltaTime += DeltaSeconds;
DemoCurrentTime += DeltaSeconds;
const double CurrentSeconds = FPlatformTime::Seconds();
const double RECORD_HZ = CVarDemoRecordHz.GetValueOnGameThread();
const double RECORD_DELAY = 1.0 / RECORD_HZ;
if ( CurrentSeconds - LastRecordTime < RECORD_DELAY )
{
return; // Not enough real-time has passed to record another frame
}
LastRecordTime = CurrentSeconds;
// Save out a frame
DemoFrameNum++;
ReplicationFrame++;
// Save elapsed game time for this frame
*FileAr << DemoDeltaTime;
#if DEMO_CHECKSUMS == 1
uint32 DeltaTimeChecksum = FCrc::MemCrc32( &DemoDeltaTime, sizeof( DemoDeltaTime ), 0 );
*FileAr << DeltaTimeChecksum;
#endif
DemoDeltaTime = 0;
// Make sure we don't have anything in the buffer for this new frame
check( ClientConnections[0]->SendBuffer.GetNumBits() == 0 );
bIsRecordingDemoFrame = true;
// Dump any queued packets
UDemoNetConnection * ClientDemoConnection = CastChecked< UDemoNetConnection >( ClientConnections[0] );
for ( int32 i = 0; i < ClientDemoConnection->QueuedDemoPackets.Num(); i++ )
{
ClientDemoConnection->LowLevelSend( (char*)&ClientDemoConnection->QueuedDemoPackets[i].Data[0], ClientDemoConnection->QueuedDemoPackets[i].Data.Num() );
}
ClientDemoConnection->QueuedDemoPackets.Empty();
const bool IsNetClient = ( GetWorld()->GetNetDriver() != NULL && GetWorld()->GetNetDriver()->GetNetMode() == NM_Client );
DemoReplicateActor( World->GetWorldSettings(), ClientConnections[0], IsNetClient );
for ( int32 i = 0; i < World->NetworkActors.Num(); i++ )
{
AActor* Actor = World->NetworkActors[i];
Actor->PreReplication( *FindOrCreateRepChangedPropertyTracker( Actor ).Get() );
DemoReplicateActor( Actor, ClientConnections[0], IsNetClient );
}
// Make sure nothing is left over
ClientConnections[0]->FlushNet();
check( ClientConnections[0]->SendBuffer.GetNumBits() == 0 );
bIsRecordingDemoFrame = false;
// Write a count of 0 to signal the end of the frame
int32 EndCount = 0;
*FileAr << EndCount;
}