I am trying to create my own Attach function Astor to Component because of fundamental problems with the Attach function. My problem is that I apparently do not understand the math and my function does not work even though it seems like I did everything correctly, but apparently I am missing something.
My сode now:
.h
UFUNCTION(BlueprintCallable, Category = "Attachment")
void AddAttachedActor(AActor* Actor, USkeletalMeshComponent* SkeletalMesh, FName BoneName);
UFUNCTION(BlueprintCallable, Category = "Attachment")
void UpdateAttachedActors();
private:
struct FAttachedActorData
{
AActor* AttachedActor;
USkeletalMeshComponent* SkeletalMeshComponent;
FName BoneName;
FTransform InitialOffset;
};
TArray<FAttachedActorData> AttachedActors;
.cpp
void AWorldASyncAttachActor::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
UpdateAttachedActors();
}
void AWorldASyncAttachActor::AddAttachedActor(AActor* Actor, USkeletalMeshComponent* SkeletalMesh, FName BoneName)
{
FTransform SocketTransform = SkeletalMesh->GetSocketTransform(BoneName, ERelativeTransformSpace::RTS_World);
SocketTransform.SetScale3D(FVector(1.0f, 1.0f, 1.0f));
FTransform ActorTransform = Actor->GetActorTransform();
FTransform InitialOffset = SocketTransform.GetRelativeTransform(ActorTransform);
FAttachedActorData Data;
Data.AttachedActor = Actor;
Data.SkeletalMeshComponent = SkeletalMesh;
Data.BoneName = BoneName;
Data.InitialOffset = InitialOffset;
AttachedActors.Add(Data);
}
void AWorldASyncAttachActor::UpdateAttachedActors()
{
for (FAttachedActorData& Data : AttachedActors)
{
FTransform SocketTransform = Data.SkeletalMeshComponent->GetSocketTransform(Data.BoneName, ERelativeTransformSpace::RTS_World);
SocketTransform.SetScale3D(FVector(1.0f, 1.0f, 1.0f));
FTransform NewActorTransform = SocketTransform * Data.InitialOffset;
Data.AttachedActor->SetActorTransform(NewActorTransform);
}
}
I’ll say in advance that it’s easy to swap the multiplication in the line
FTransform NewActorTransform = SocketTransform * Data.InitialOffset;
does not lead to the desired result.
My desired result is the Attach with “Keep World” function.