Custom Component, Unreal Engine里定制组件

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);
}
}


你可能感兴趣的:(Unreal,Engine,unreal,engine,components,c++)