在上一篇文章里,我们实现了召唤技能,并且能够无限的召唤。所以,这属于一个bug,我们不能无限制的去召唤,这会影响游戏的体验。所以,在这篇里面,我们实现一下对召唤物数量的限制,并优化一些相关的内容。
优化召唤物的朝向
首先,我们将召唤物的朝向修改一下,不想让召唤出来的怪物都是固定的朝向,而是根据召唤者的位置,让它的后背朝向召唤者。我们可以获取召唤者的位置到召唤物的方向,来设置召唤物的朝向。
添加相关代码
我们接下来,想实现在召唤师召唤了一定数量的仆从后,将不再继续召唤仆从,转而使用攻击技能攻击玩家。那么,它就需要拥有两个技能,一个攻击技能和一个召唤技能。
要区分触发的技能,我们需要给它设置不同的标签,攻击的标签现在是Attack,那么我们需要增加一个召唤技能触发的标签。
我们通过代码再添加一个标签
FGameplayTag Abilities_Summon; //召唤技能激活标签
然后注册到标签管理器,这样在代码中和UE里面都能够使用标签
GameplayTags.Abilities_Summon = UGameplayTagsManager::Get()
.AddNativeGameplayTag(
FName("Abilities.Summon"),
FString("召唤技能标签")
);
然后我们在角色基类上面添加一个属性,用于记录当前角色拥有的仆从数量
UPROPERTY(BlueprintReadOnly, Category="Combat")
int32 MinionsCount = 0; //仆从数量
有了属性,我们需要添加一个获取数量的函数,这个函数添加在接口里,我们在战斗接口添加一个获取仆从数量的函数
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
int32 GetMinionCount(); //获取角色拥有的仆从数量
在角色基类里覆写它
virtual int32 GetMinionCount_Implementation() override;
接着我们增加一个可以增加仆从数量的函数,在战斗接口中创建
UFUNCTION(BlueprintNativeEvent, BlueprintCallable)
void IncrementMinionCount(const int32 Amount); //设置角色仆从的增长数量,负数为负增长
然后在角色基类中覆写
virtual void IncrementMinionCount_Implementation(const int32 Amount) override;
在cpp中,通过传入的数字去修改仆从数量
void ARPGCharacter::IncrementMinionCount_Implementation(const int32 Amount)
{
MinionCount += Amount;
}
创建新的行为树和任务
上面,我们增加一些代码,用来实现需求,可以获取也可以设置角色所拥有的仆从的数量。我们还需要创建一个新的行为树,用于修改召唤师敌人的AI逻辑,然后增加一个新的任务,在里面实现是使用召唤技能增加仆从还是使用攻击技能攻击玩家。
我们首先将之前制作的行为书复制一份去修改
设置好用于元素师专用的行为树
然后将萨满使用的行为树修改掉
接着在数据里面给元素师类型的数据添加上攻击技能,这样,在通过标签触发技能的时候,攻击技能就可以通过Attack标签触发,召唤技能可以通过Summon标签触发
我们将召唤技能的标签修改成召唤标签
准备工作完成,接下来,我们将修改行为树,我们需要将行为树中的攻击任务修改掉,将其修改成能功判断使用召唤技能还是攻击技能
接下来,我们复制一个攻击任务,在此基础上扩展
命名为BTT_Attack_Elementalist
我们在任务里面新增两个属性标签,一个召唤激活标签,用于激活召唤技能使用,另一个是技能标签,我们通过逻辑修改,激活时,使用它去激活
我们修改逻辑,增加对于召唤师仆从的数量进行判断,如果小于1, 将进行再次召唤
true分支是激活召唤技能,false是不需要召唤,那么将使用攻击技能
最后,激活技能使用AbilityTag去激活
以下是完整节点
如果需要修改剩余仆从数量继续召唤的值,我们可以创建一个变量,在行为树中去修改
接着进入行为树中,将之前的攻击节点替换掉,并修改配置项
接着,我们进入召唤技能蓝图,在召唤技能蓝图里,我们在每生成一个仆从后,将角色仆从数量加1
那么,如何实现仆从死亡时,减少数量呢,我们添加监听事件,监听仆从的销毁事件,在其被销毁掉时,将仆从数量减1
然后绑定销毁事件,在销毁事件触发时,减少一个数量
接着就可以运行效果,如果萨满能带着五个小弟干你,证明没有问题
当然,你还要测试将它小弟都解决以后,能不能重新召唤。贴一下完成召唤技能节点