C++动画蓝图实例

首先我们要在编辑器中创建我们的C++文件

创建完成后,我们对原生的初始化动画进行重写,对原生的动画进行更新。

	virtual void NativeInitializeAnimation() override;//对原生的初始化动画进行重写
	virtual void NativeUpdateAnimation(float DeltaSeconds) override;//对原生的动画进行更新

给新的动画蓝图实例提供变量:

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Reference", meta = (AllowPrivateAccess = "true"))
	float GroundSpeed;
	void GetGroundSpeed();

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Reference", meta = (AllowPrivateAccess = "true"))
	float AirSpeed;
	void GetAirSpeed();

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Reference", meta = (AllowPrivateAccess = "true"))
	bool bShouldMove;
	void GetShouldMove();

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Reference", meta = (AllowPrivateAccess = "true"))
	bool bIsFalling;
	void GetIsFalling();
void UCharacterAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();
    //获取人物
	ClimbingSystemCharacter = Cast<AClimbingSystemCharacter>(TryGetPawnOwner());

	if (ClimbingSystemCharacter)//判断人物是否被获取
	{
		CustomMovementComponent = ClimbingSystemCharacter->GetCustomMovementComponent();
		if (CustomMovementComponent == nullptr)
		{
			Debug::Print("movement component is null");
			
		}
	}
}

void UCharacterAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);
	if (!ClimbingSystemCharacter || !CustomMovementComponent) return;

	GetGroundSpeed();
	GetAirSpeed();
	GetShouldMove();
	GetIsFalling();
	GetIsClimbing();
	GetClimbVelocity();
}
void UCharacterAnimInstance::GetGroundSpeed()
{
	GroundSpeed = UKismetMathLibrary::VSizeXY(ClimbingSystemCharacter->GetVelocity());
	
}

void UCharacterAnimInstance::GetAirSpeed()
{
	AirSpeed = ClimbingSystemCharacter->GetVelocity().Z;

}

void UCharacterAnimInstance::GetShouldMove()
{
	bShouldMove =(CustomMovementComponent->GetCurrentAcceleration().Size() > 0) &&GroundSpeed > 5.f &&!bIsFalling;
//判断加速度是否大于0,地面速度是否大于5,是否为落地模式
}

void UCharacterAnimInstance::GetIsFalling()
{
	bIsFalling = CustomMovementComponent->IsFalling();
}

之后回到编译器,将写好的实例创建出来。将创建好的动画蓝图赋予人物身上。

在状态机中调整我们实现动作的条件

动态机完成后,我们在回到代码,创建动画实例和,通过动画实例来调用蒙太奇

	void PlayClimbMontage(UAnimMontage* MontageToPlay);//调用蒙太奇函数
	UFUNCTION()
	void OnClimbMontageEnded(UAnimMontage* Montage, bool bInterrupted);
	
	UPROPERTY()
	class UAnimInstance* OwningPlayerAnimInstance;//创建播放器实例
	UPROPERTY()
	class AClimbingSystemCharacter* OwningPlayerCharacter;
void UCustomMovementComponent::PlayClimbMontage(UAnimMontage* MontageToPlay)
{
	if (!MontageToPlay)
	{
		Debug::Print(TEXT("Montage is NULL"));
		return;
	}
	if (!OwningPlayerAnimInstance)
	{
		Debug::Print(TEXT("Anim Instance is NULL"));
		return;
	}
	if (OwningPlayerAnimInstance->IsAnyMontagePlaying())//如果有任意的montage在运行,也会返回退出
	{
		Debug::Print(TEXT("Other Montage is Playing"));
		return;
	}
	Debug::Print(TEXT("PlayMontage"));
	OwningPlayerAnimInstance->Montage_Play(MontageToPlay);

}
void UCustomMovementComponent::OnClimbMontageEnded(UAnimMontage* Montage, bool bInterrupted)
{

	 if (Montage == IdleToClimbMontage || Montage == ClimbDownLedgeMontage)
	 {
	 	StartClimbing();
	 	StopMovementImmediately();
	 }
	 if(Montage == ClimbToTopMontage || Montage == ValueMontage)
	  {
	  	SetMovementMode(MOVE_Walking);
	  }
	Debug::Print(TEXT("Climb Montage Ended"));
}
void UCustomMovementComponent::BeginPlay()
{
	// Call the base class  
	Super::BeginPlay();
		OwningPlayerAnimInstance = CharacterOwner->GetMesh()->GetAnimInstance();//获取动画实例

	 if (OwningPlayerAnimInstance)
	 {
	 	OwningPlayerAnimInstance->OnMontageEnded.AddDynamic(this, &UCustomMovementComponent::OnClimbMontageEnded);
	 	OwningPlayerAnimInstance->OnMontageBlendingOut.AddDynamic(this, &UCustomMovementComponent::OnClimbMontageEnded);
	 }

	OwningPlayerCharacter = Cast<AClimbingSystemCharacter>(CharacterOwner);
  
}

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要调用蓝图的自定义事件,需要在蓝图中创建一个自定义事件,并将其公开为可调用的函数。然后,在蓝图外部的其他蓝图蓝图实例中,可以使用“执行自定义事件”节点来调用该事件。 以下是调用蓝图自定义事件的步骤: 1. 在蓝图中创建自定义事件 在蓝图编辑器中,选择要添加自定义事件的节点,然后在节点上右键单击并选择“添加自定义事件”。命名事件并添加所需的输入和输出参数。 2. 公开自定义事件 在蓝图编辑器中,选择要公开自定义事件的节点,然后在节点上右键单击并选择“公开为函数”。这将使自定义事件可在蓝图外部调用。 3. 调用自定义事件 在蓝图外部的其他蓝图蓝图实例中,使用“执行自定义事件”节点来调用该事件。将要调用的蓝图和自定义事件名称作为节点的输入参数。 例如,假设您有一个名为“MyBlueprint”的蓝图,并且在其中创建了一个名为“MyCustomEvent”的自定义事件。要从另一个蓝图调用此事件,可以按如下方式使用“执行自定义事件”节点: 1. 添加“执行自定义事件”节点到蓝图中 2. 将“执行自定义事件”节点连接到要触发事件的目标蓝图 3. 在“执行自定义事件”节点的输入面板中,选择要调用的蓝图和自定义事件名称 4. 配置自定义事件的输入参数(如果有的话) 5. 触发“执行自定义事件”节点,以触发目标蓝图中的自定义事件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值