UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
class UAnimMontage* AnimMontage;
//记录点击的变量和函数
bool bClicking;
UFUNCTION()
void OnClickBegin();
UFUNCTION()
void OnClickEnd();
//记录攻击的变量和函数
bool bAttacking;
void AttackBegin();
UFUNCTION(BlueprintCallable)
void AttackEnd();
oid AMan::OnInteract()
//如果没有进行攻击
if (!bAttacking)
//这里的ActiveOverlapItem值是Weapon触发函数里给的
//遇见了物体尝试转化为武器
AWeapon *Weapon = Cast<AWeapon>(ActiveOverlapItem);
//如果成功
if (Weapon)
Weapon->Equip(this);
ActiveOverlapItem = nullptr;
鼠标点击时,没有正在进行攻击并且装备了武器就可以进行攻击
void AMan::OnClickBegin()
bClicking = true;
//如果没有开始攻击并装备了武器
if (!bAttacking && EquippedWeapon)
AttackBegin();
鼠标结束就可以将bClicking设为false
void AMan::OnClickEnd()
bClicking = false;
攻击函数,bAttacking设为true
首先获取蒙太奇实例,然后判断是否有蒙太奇动画、有动画实例并且蒙太奇攻击动画没有执行;
如果是,动画实例播放蒙太奇动画,
然后采用布尔随机数,进行攻击动画的随机播放。
void AMan::AttackBegin()
bAttacking = true;
//拿到动画实例
UAnimInstance *Instance = GetMesh()->GetAnimInstance();
//如果有蒙太奇动画、有动画实例并且蒙太奇攻击动画没有执行
if (AnimMontage && Instance && !Instance->Montage_IsPlaying(AnimMontage))
//实例播放蒙太奇动画
Instance->Montage_Play(AnimMontage);
if (FMath::RandBool())
Instance->Montage_JumpToSection(FName("Attack1"), AnimMontage);
Instance->Montage_JumpToSection(FName("Attack2"), AnimMontage);
攻击结束bAttacking为false
如果鼠标一直按住,执行连续攻击
void AMan::AttackEnd()
bAttacking = false;
//如果鼠标一直按住,执行连续攻击
if (bClicking && EquippedWeapon)
AttackBegin();
项目设置中添加鼠标映射,在这里绑定
// Called to bind functionality to input
void AMan::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
Super::SetupPlayerInputComponent(PlayerInputComponent);
///////////////////////////////////其它省略///////////////////////////////
//绑定鼠标攻击
PlayerInputComponent->BindAction("Click", IE_Pressed, this, &AMan::OnClickBegin);
PlayerInputComponent->BindAction("Click", IE_Released, this, &AMan::OnClickEnd);
然后在人物蓝图中,选取我们自定义的蒙太奇动画
攻击结束蓝图实现
其实到这里,上述的攻击部分还有一些问题,攻击一次就不执行攻击了,因为没有进入AttackEnd的条件
在程序里检测攻击的结束其实比较困难,因此我们在蒙太奇里添加一个结束表示用于表示动画结束
然后在动画蓝图中使用蒙太奇结束事件,调用AttackEnd函数,这样就可以了