if you want to do every tick to any Actor, you'd better write your own Component.
the probable
problems you may went through:
1. TickComponent not called at all.
solution:
You can set the ticking properties of a component through its PrimaryComponentTick property. Try adding the following to your component's constructor:
PrimaryComponentTick.bCanEverTick = true;
2. TickComponent called only Once.
Solution:
As it turns out. C++ components are not active by default. Activating the component caused TickComponent to be called more than once. Tye adding the following to your component's constructor:
bAutoActivate = true;
3. You can not fine your custom Component in the Add Components List
I think you may be missing sth like "..,meta = (BlueprintSpawnableComponent)" just before function declaration.
Get ActorLocation and Rotation should be written as:
this->GetOwner()->GetLocation();
this->GetOwner()->SetLocation(...);
this->GetOwner()->GetRotation();
this->GetOwner()->SetRotation(...);
Sample:
.h
#pragma once
#include "FaceToMainCharacterComp.generated.h"
UCLASS(ClassGroup = FaceTo,meta = (BlueprintSpawnableComponent))
class UFaceToMainCharacterComp : public UActorComponent
{
GENERATED_UCLASS_BODY()
protected:
virtual void TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction);
};
.cpp
#include "MyThirdPersonCode.h" //change it to YourOwnGame.h
#include "FaceToMainCharacterComp.h"
UFaceToMainCharacterComp::UFaceToMainCharacterComp(class FPostConstructInitializeProperties const &PCIP)
: Super(PCIP)
{
PrimaryComponentTick.bCanEverTick = true;
bAutoActivate = true;
}
void UFaceToMainCharacterComp::TickComponent(float DeltaTime, enum ELevelTick TickType, FActorComponentTickFunction *ThisTickFunction)
{
Super::TickComponent(DeltaTime, TickType, ThisTickFunction);
ACharacter* player = UGameplayStatics::GetPlayerCharacter(this, 0);
FVector playerLoc = player->K2_GetActorLocation();
FVector actorLoc = this->GetOwner()->GetActorLocation();
FVector offDir = playerLoc - actorLoc;
offDir *= FVector(1.0, 1.0, 0.0);
offDir.Normalize();
FRotator rot = offDir.Rotation();
this->GetOwner()->SetActorRotation(rot);
FVector tmp;
float length = 0.0;
FVector distDir = playerLoc - actorLoc;
distDir.ToDirectionAndLength(tmp, length);
distDir.Normalize();
if (length > 100.0)
{
this->GetOwner()->SetActorLocation(actorLoc + distDir);
}
}