其实蓝图对于很多基础游戏逻辑,比如人物位移,技能CD,动画混合来说,性能上已经和C++不存在太大的差异(当然关键还是看编程思维,比如减少函数调用,复用对象保存等等),C++的话其实更适合用来做AI,算法排序,数据运算等计算内容可能更合适一些(也比蓝图容易看懂)。但是有的时候蓝图还是显得过于庞大了,不如代码来得直观,所以,那就试试用C++来实现动画蓝图吧!
主要是使用C++重写了TP(第三人称控制)的动画蓝图,主要内容是两个,判断是否跳起(在空中),传输当前的控制分量(位移方向)给Pawn的控制器,可以了解到一些UE4C++的基本控制方法。
其实参考了wiki上的那两篇之后,应该已经没有什么太大问题了,不过还是记录一下。
// MyAnimInstance.h --伪代码
UCLASS()
class TPCPPDEMO_API UMyAnimInstance : public UAnimInstance
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite)
bool bIsAir;
//bool* bpIsAir;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float fSpeed;
APawn * OwningPawn;
UPawnMovementComponent* OwningPawnMoveComponet;
ATPCPPDemoCharacter* TPCPPDemoCharacterMain;
UMyAnimInstance();
//重写了两个函数,一个初始化,一个update
virtual void NativeInitializeAnimation() override;
virtual void NativeUpdateAnimation(float DeltaSeconds) override;
}
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
Super::NativeUpdateAnimation(DeltaSeconds);
//UE_LOG(LogTemp, Log, TEXT("MyAnimInstance::NativeUpdateAnimation."));
if (OwningPawnMoveComponet)
{
//*bpIsAir=OwningPawnMoveComponet->IsFalling();
bIsAir=OwningPawnMoveComponet->IsFalling();
fSpeed = OwningPawn->GetVelocity().Size();
}
else
{
#if !WITH_EDITOR
UE_LOG(LogTemp, Warning, TEXT("MyAnimInstance.OwningPawnMoveComponet is null"));
#endif
return;
}
}
void UMyAnimInstance::NativeInitializeAnimation()
{
Super::NativeInitializeAnimation();
bIsAir = false;
//bpIsAir = false;
fSpeed = 0.0f;
OwningPawn = TryGetPawnOwner();
if (OwningPawn)
{
OwningPawnMoveComponet = OwningPawn->GetMovementComponent();
TPCPPDemoCharacterMain = Cast<ATPCPPDemoCharacter>(OwningPawn);
}
else
{
UE_LOG(LogTemp, Warning, TEXT("MyAnimInstance.OwningPawn is null"));
}
}
然后至于其他功能和游戏方面的逻辑,其实性能上和C++是不会出现太大差异的,有时可以参考一下蓝图转C++,查看调用的内部函数。当然这样转换出来的C++变量名和函数名都是一长串,但是整体还算可读的。