UE4笔记-002-使用C++进行AnimationBlueprint的编写

UE4笔记-002-使用C++进行AnimationBlueprint的编写

其实蓝图对于很多基础游戏逻辑,比如人物位移,技能CD,动画混合来说,性能上已经和C++不存在太大的差异(当然关键还是看编程思维,比如减少函数调用,复用对象保存等等),C++的话其实更适合用来做AI,算法排序,数据运算等计算内容可能更合适一些(也比蓝图容易看懂)。但是有的时候蓝图还是显得过于庞大了,不如代码来得直观,所以,那就试试用C++来实现动画蓝图吧!

参考内容

主要是使用C++重写了TP(第三人称控制)的动画蓝图,主要内容是两个,判断是否跳起(在空中),传输当前的控制分量(位移方向)给Pawn的控制器,可以了解到一些UE4C++的基本控制方法。

  1. Wiki-关于动画蓝图.
  2. Wiki-关于动画蓝图的循环.

简单说明

其实参考了wiki上的那两篇之后,应该已经没有什么太大问题了,不过还是记录一下。

  1. AnimationBlueprint 的基类为AnimInstance,而其中的Tick函数为NativeUpdateAnimation,所以,当要实现状态更新时,蓝图中是通过BlueprintUpdateAnimation事件,那么C++中就需要使用NativeUpdateAnimation函数。
// 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;
	}
  1. 在初始化的时候把相关变量保存下来,方便复用,减少其他函数的调用次数,使用了预编译指令WITH_EDITOR是因为NativeUpdateAnimation在编辑状态也会运行,会一直打印错误信息,Pawn对象为空,原因暂时懒得调查了,所以加上了预编译指令,省得Log一堆Waring。
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++变量名和函数名都是一长串,但是整体还算可读的。
一键转换C++岂不美哉

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值