UE5多人MOBA+GAS 17、制作小兵的动画蓝图、攻击GA以及死亡和复活的AI感知开关

发布于:2025-07-14 ⋅ 阅读:(25) ⋅ 点赞:(0)


给小兵做一个动画蓝图

添加小兵素材,给小兵创建一个动画蓝图
在这里插入图片描述
在这里插入图片描述
给小兵换动画蓝图以及模型
在这里插入图片描述

制作小兵的攻击GA以及动画

给AI做普通攻击
在这里插入图片描述
在这里插入图片描述
在小兵蓝图更换GA
在这里插入图片描述
制作GA用的蒙太奇(还是用回作者的老路了)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在创建一个GE应用伤害
在这里插入图片描述
在这里插入图片描述
小兵就可以挥刀砍我了
在这里插入图片描述

创建GC_Hit作为受击特效的父类

创建一个可复用的GC_Hit(其实我更喜欢传值进去)
在这里插入图片描述
让机器人的Hit继承他
在这里插入图片描述
再修改一下特效
在这里插入图片描述
给小兵设置受击GC
在这里插入图片描述
新增后修改父类
在这里插入图片描述
伤害GE中添加GC(这个受击动画不出意外应该是用一个接口给传了,一个个做太麻烦了)
在这里插入图片描述
给小兵写一个初始化GE,调整他的血条(其实给小兵蓝也没用,这玩意没蓝)
在这里插入图片描述
在这里插入图片描述
顺便调整一下小兵的移速
在这里插入图片描述

小兵死亡和复活的AI感知开启与关闭

CAIController中添加启用和禁用感知的函数,以及监听死亡标签的函数,在服务器初始化的时候监听tag标签

	// 清除并禁用所有感知(如死亡时调用)
	void ClearAndDisableAllSenses();

	// 启用所有感知(如复活时调用)
	void EnableAllSenses();
	
    // 监听Pawn死亡Tag变化,控制AI逻辑启停
    void PawnDeadTagUpdated(const FGameplayTag Tag, int32 Count);
void ACAIController::OnPossess(APawn* InPawn)
{
	Super::OnPossess(InPawn);
	// 随便设置的队伍
	SetGenericTeamId(0);
	IGenericTeamAgentInterface* PawnTeamInterface = Cast<IGenericTeamAgentInterface>(InPawn);
	if (PawnTeamInterface)
	{
		PawnTeamInterface->SetGenericTeamId(GetGenericTeamId());
		//SetGenericTeamId(PawnTeamInterface->GetGenericTeamId());
	}

	UAbilitySystemComponent* PawnASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(InPawn);
	if (PawnASC)
	{
		PawnASC->RegisterGameplayTagEvent(TGameplayTags::Stats_Dead, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &ACAIController::PawnDeadTagUpdated);
	}
}
void ACAIController::ClearAndDisableAllSenses()
{
	// 老化所有感知刺激到最大时间值,强制标记为过期状态
	AIPerceptionComponent->AgeStimuli(TNumericLimits<float>::Max());

	// 遍历所有感知配置并禁用它们
	for (auto SenseConfigIt = AIPerceptionComponent->GetSensesConfigIterator(); SenseConfigIt; ++SenseConfigIt)
	{
		AIPerceptionComponent->SetSenseEnabled((*SenseConfigIt)->GetSenseImplementation(), false);
	}
	if (GetBlackboardComponent())
	{
		// 消除黑板中的目标值
		GetBlackboardComponent()->ClearValue(TargetBlackboardKeyName);
	}
}

void ACAIController::EnableAllSenses()
{
	// 遍历所有感知配置并启用它们
	for (auto SenseConfigIt = AIPerceptionComponent->GetSensesConfigIterator(); SenseConfigIt; ++SenseConfigIt)
	{
		AIPerceptionComponent->SetSenseEnabled((*SenseConfigIt)->GetSenseImplementation(), true);
	}
}

void ACAIController::PawnDeadTagUpdated(const FGameplayTag Tag, int32 Count)
{
	if (Count != 0)
	{
		GetBrainComponent()->StopLogic("Dead"); // 停止死亡状态下的逻辑
		ClearAndDisableAllSenses(); // 清除感知数据
	}
	else
	{
		GetBrainComponent()->StartLogic(); // 重新启动AI逻辑
		EnableAllSenses(); // 启用感知系统
	}
}

去到角色CCharacter中在死亡的时候取消激活的技能

void ACCharacter::StartDeathSequence()
{
	OnDead();

	// 取消激活的技能
	if (CAbilitySystemComponent)
	{
		CAbilitySystemComponent->CancelAllAbilities();
	}
}

网站公告

今日签到

点亮在社区的每一天
去签到