虚幻引擎GAS入门学习笔记(二)

虚幻引擎GAS入门(二)

  • 学习位置UE5.3 GAS入门教程重置版 小明

MVC框架与技能初始化

  • 让一开始创建的蓝图的基础GameplayAbility蓝图继承我们写好的BaseGameplayAbility
    在这里插入图片描述
  • 创建一个库函数,写一些常用的函数在里面
  • 第一个得到玩家与玩家控制器
    在这里插入图片描述
  • 获取角色面对目标的方向
    在这里插入图片描述
  • 将技能UI添加到主UI中
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中创建一个函数用来初始化技能
    在这里插入图片描述

编写回血技能

添加MP与Strength的变化逻辑

  • 添加MP与Strength的变化函数
    在这里插入图片描述
  • 绑定他们的通知与广播
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中更新MP与Strength
    在这里插入图片描述

创建回血技能

  • 创建技能的步骤
    在这里插入图片描述

魔法与能量改变时候的通知

  • 在BaseAbility蓝图中写入检查通知
    在这里插入图片描述
  • 新建一个继承自基类的GameplayAbility技能蓝图,然后添加标记,选中
    在这里插入图片描述
    在这里插入图片描述
  • 添加回血技能的效果
    在这里插入图片描述
  • 消耗15点蓝
    在这里插入图片描述
  • 然后继续添加技能CD
    在这里插入图片描述
  • 添加GameplayCueNotify_Static蓝图用来添加特效
    在这里插入图片描述
  • 先添加标签
    在这里插入图片描述
    在这里插入图片描述
  • 在回复技能中添加这个Cue
    在这里插入图片描述
  • 学习技能
    在这里插入图片描述
  • 创建一个激活函数来激活技能
    在这里插入图片描述
  • 技能的图标给上,特效给上
    在这里插入图片描述
    在这里插入图片描述
  • 制作回血Montage
    在这里插入图片描述
  • 播放回血技能
    在这里插入图片描述
  • 将特效的材质加上
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中添加一个判断是否满血的函数
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

冲刺技能

  • 制作冲刺技能的Montage
    在这里插入图片描述
  • 添加一个继承自BaseAbility技能蓝图的技能蓝图
    在这里插入图片描述
    在这里插入图片描述
  • 添加标签与技能效果
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 分别设置这些效果属性
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 添加图标
    在这里插入图片描述
  • 在角色蓝图中添加技能,然后添加这个激活的技能标签
    在这里插入图片描述
    在这里插入图片描述
  • 使用技能
    在这里插入图片描述

添加技能冲刺的力的作用

  • 添加一个事件来作为技能向前的作用力
    在这里插入图片描述
  • 先记录一下摩擦力
    在这里插入图片描述
  • 在角色基类里面添加一个消除摩擦力的函数
    在这里插入图片描述
  • 在角色身上添加一个碰撞球
    在这里插入图片描述
  • 将碰撞到的碰撞的信息发送出去
    在这里插入图片描述
  • 消除摩擦力函数在这调用,然后接收这事件应用添加伤害效果
    在这里插入图片描述
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述
  • 在敌人蓝图中添加一个被冲刺击晕的事件和一个回复控制器控制的函数
    在这里插入图片描述
    在这里插入图片描述
  • 新建一个击飞的Montage
    在这里插入图片描述
  • 再添加一个推开的事件
    在这里插入图片描述
  • 调用击退与眩晕函数
    在这里插入图片描述
  • 技能结束时将角色的摩擦力添加上
    在这里插入图片描述

使用冲刺技能阶段不能被打断

  • 冲刺技能这激活自有标签
    在这里插入图片描述
  • 其他技能激活阻止标签
    在这里插入图片描述
    在这里插入图片描述

激光技能

  • 新建激光技能,以及CD、Cost、伤害
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在角色蓝图中添加我们需要学习的这个新技能
    在这里插入图片描述
    在这里插入图片描述
  • 提交技能,触发技能
    在这里插入图片描述
    在这里插入图片描述

创建激光Actor

  • 添加激光骨骼,添加一个碰撞球检测碰撞,添加一个摄像机臂
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 做这个激光的思路,这个骨骼只有三个,我们在动画蓝图中调节这个end位置就可以达到效果了,通过摄像机臂的碰撞检测碰到的第一个物体会进行阻挡
    在这里插入图片描述
  • 给激光骨骼创建动画蓝图,写入修改end骨骼逻辑
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 将动画蓝图给到激光
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

激光的生成

  • 制作激光的Montage动画
    在这里插入图片描述
  • 在激光Cost上添加一个资产标签,作用于技能结束后清除这个标签
    在这里插入图片描述
  • 技能结束时候删除标签进入CD
    在这里插入图片描述
  • 在角色蓝图中添加一个箭头来表示激光的发射位置
    在这里插入图片描述
  • 触发激光技能时就锁定视角,将激光Actor附加到表示激光发射位置的箭头组件上
    在这里插入图片描述
  • 结束后回复视角
    在这里插入图片描述

各个技能之间的相互打断

  • 手动取消技能,当再次按3的时候就关闭技能,用一个bool变量来标志技能是否在释放,然后使用事件分发去关闭技能
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 在基类技能蓝图中将:
    • Cancel Abilities with Tag:取消带有特定标签的能力,让技能之间相互打断
    • Activation Blocked Tags:阻止带有某些标签的能力激活,当这个tag被激活的时候,所有带这个tag的都不能被激活,让冲刺技能的优先级最高
      在这里插入图片描述

给激光技能添加伤害与击飞

  • 将激光的碰撞到敌人添加到数组中
    在这里插入图片描述
  • 每隔0.25秒进行一次消息
    在这里插入图片描述
  • 在角色基类蓝图中添加一个函数用来检测魔法值是否消耗完在这里插入图片描述
  • 拿到敌人的信息然后应用伤害与击飞眩晕效果
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

一般报错处理

  • 如果爆这种错误,就去这些位置添加判断IsValid,进行防御性编程
    在这里插入图片描述

山崩地裂技能

  • 首先制作这个技能的Montage
    在这里插入图片描述
  • 首先还是添加技能那一套
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

编写目标函数

  • 新建GameplayAbilityTargetActor类来编写目标
    • 这个类主要用于处理游戏能力的目标选择。这个类提供了一个框架,让开发者能够创建自定义的目标选择行为,比如选择一个点、一个区域、一个或多个敌人等。目标选择是许多游戏机制中的关键部分,例如施放技能时需要指定攻击目标或者范围
      在这里插入图片描述
  • 重写这两个函数
    在这里插入图片描述
  • meta = (ExposeOnSpawn = true):这是一个元数据标签,表示当这个 Actor 作为另一个 Actor 的子对象生成时(例如,通过 SpawnActor 或 BeginPlay),这个属性可以在生成时被设置。
    在这里插入图片描述
  • 实现逻辑
// Fill out your copyright notice in the Description page of Project Settings.#include "GroundSelectTargetActor.h"
#include "Abilities/GameplayAbility.h"void AGroundSelectTargetActor::StartTargeting(UGameplayAbility* Ability)
{Super::StartTargeting(Ability);// 获取拥有该能力的控制器,并将其转换为 APlayerController 类型PrimaryPC = Cast<APlayerController>(Ability->GetOwningActorFromActorInfo()->GetInstigatorController());
}void AGroundSelectTargetActor::ConfirmTargetingAndContinue()
{//存储玩家注视点位置FVector LookPoint;GetPlayerLookAtPoint(LookPoint);// 定义一个数组来存储重叠结果TArray<FOverlapResult> OverlapResults;// 定义一个数组来存储找到的敌对角色TArray<TWeakObjectPtr<AActor>> OverlapActors;// 创建碰撞查询参数FCollisionQueryParams QueryParams;QueryParams.bTraceComplex = false;QueryParams.bReturnPhysicalMaterial = false;// 获取当前玩家控制的角色APawn* SelfPawn = PrimaryPC->GetPawn();if (SelfPawn){// 忽略当前玩家控制的角色,防止自撞QueryParams.AddIgnoredActor(SelfPawn);}// 执行重叠检测,查找指定半径内的所有 Pawnbool QueryResult = GetWorld()->OverlapMultiByObjectType(OverlapResults, LookPoint,FQuat::Identity, // 旋转(默认为单位四元数)FCollisionObjectQueryParams(ECollisionChannel::ECC_Pawn), // 只检测 Pawn 类型的对象FCollisionShape::MakeSphere(selectRadius),// 使用球形碰撞形状,半径为 selectRadiusQueryParams);if (QueryResult){for (int i = 0; i < OverlapResults.Num(); i++){// 将重叠结果转换为 APawnAPawn* Enemy = Cast<APawn>(OverlapResults[i].GetActor());if (Enemy && !OverlapActors.Contains(Enemy))//敌人存在且没有重复包含{OverlapActors.Add(Enemy);}} }// 创建一个 FGameplayAbilityTargetDataHandle 来存储目标数据FGameplayAbilityTargetDataHandle TargetDataHandle;// 创建一个 FGameplayAbilityTargetData_LocationInfo 对象来存储中心位置FGameplayAbilityTargetData_LocationInfo* CenterLoc = new FGameplayAbilityTargetData_LocationInfo();CenterLoc->TargetLocation.LiteralTransform = FTransform(LookPoint);// 设置位置// 设置位置类型CenterLoc->TargetLocation.LocationType = EGameplayAbilityTargetingLocationType::LiteralTransform;//0号负载TargetDataHandle.Add(CenterLoc);// 将中心位置数据添加到 TargetDataHandleif (OverlapActors.Num() > 0){// 创建一个 FGameplayAbilityTargetData_ActorArray 对象来存储找到的敌人FGameplayAbilityTargetData_ActorArray* ActorArray = new FGameplayAbilityTargetData_ActorArray();ActorArray->SetActors(OverlapActors);// 设置找到的敌人//1号负载TargetDataHandle.Add(ActorArray); // 将敌人数据添加到 TargetDataHandle}// 检查是否应该生成目标数据check(ShouldProduceTargetData());// 检查是否允许确认目标if (IsConfirmTargetingAllowed()){// 广播目标数据准备就绪的委托TargetDataReadyDelegate.Broadcast(TargetDataHandle);}
}bool AGroundSelectTargetActor::GetPlayerLookAtPoint(FVector& Out_LookPoint)
{FVector ViewLoc;//射线开始位置FRotator ViewRot;PrimaryPC->GetPlayerViewPoint(ViewLoc, ViewRot);FVector ViewEnd = ViewLoc + ViewRot.Vector() * 50000.f;//射线终点位置FHitResult HitResult;FCollisionQueryParams QueryParams;//检测QueryParams.bTraceComplex = true;//复杂检测APawn* SelfPawn = PrimaryPC->GetPawn();//忽略自己if (SelfPawn){QueryParams.AddIgnoredActor(SelfPawn);}//碰撞到物体就会返回一个bool值bool TraceResult = GetWorld()->LineTraceSingleByChannel(HitResult, ViewLoc, ViewEnd,ECollisionChannel::ECC_Visibility, QueryParams);if (TraceResult){Out_LookPoint = HitResult.ImpactPoint;//返回碰撞到的点}return TraceResult;
}
  • 新建一个材质
    在这里插入图片描述
  • 新建这个类的蓝图
    在这里插入图片描述
  • 新建一个施法Montage
    在这里插入图片描述

技能的取消

  • 右键取消技能
    在这里插入图片描述
    在这里插入图片描述
  • 在敌人蓝图中添加一个向上击飞事件
    在这里插入图片描述
  • 逻辑
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

点燃技能

  • 标准技能一套
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 创建点燃技能Montage
    在这里插入图片描述
  • 在动画蓝图中去发送Gameplay通知
    在这里插入图片描述

编写目标函数

  • 再次新建GameplayAbilityTargetActor类来编写目标
    在这里插入图片描述
  • 实现逻辑
// Fill out your copyright notice in the Description page of Project Settings.#include "AroundGameplayAbilityTargetActor.h"
#include "Abilities/GameplayAbility.h"void AAroundGameplayAbilityTargetActor::StartTargeting(UGameplayAbility* Ability)
{Super::StartTargeting(Ability);// 获取拥有该能力的控制器,并将其转换为 APlayerController 类型PrimaryPC = Cast<APlayerController>(Ability->GetOwningActorFromActorInfo()->GetInstigatorController());
}void AAroundGameplayAbilityTargetActor::ConfirmTargetingAndContinue()
{APawn* SelfPawn = PrimaryPC->GetPawn();if (!SelfPawn){return;}FVector LookPoint = SelfPawn->GetActorLocation();TArray<FOverlapResult> OverlapResults;TArray<TWeakObjectPtr<AActor>> OverlapActors;FCollisionQueryParams QueryParams;QueryParams.bTraceComplex = false;QueryParams.bReturnPhysicalMaterial = false;if (SelfPawn){QueryParams.AddIgnoredActor(SelfPawn);}// 执行重叠检测,查找指定半径内的所有 Pawnbool QueryResult = GetWorld()->OverlapMultiByObjectType(OverlapResults, LookPoint,FQuat::Identity, // 旋转(默认为单位四元数)FCollisionObjectQueryParams(ECollisionChannel::ECC_Pawn), // 只检测 Pawn 类型的对象FCollisionShape::MakeSphere(AroundRadius),// 使用球形碰撞形状,半径为 selectRadiusQueryParams);//有重叠结果添加到 OverlapActors 数组if (QueryResult){for (int i = 0; i < OverlapResults.Num(); i++){APawn* Enemy = Cast<APawn>(OverlapResults[i].GetActor());if (Enemy && !OverlapActors.Contains(Enemy)){OverlapActors.Add(Enemy);}}}//存储目标数据FGameplayAbilityTargetDataHandle TargetDataHandle;if (OverlapActors.Num() > 0){//存储找到的敌人FGameplayAbilityTargetData_ActorArray* ActorArray = new FGameplayAbilityTargetData_ActorArray();//设置找到的敌人ActorArray->SetActors(OverlapActors);//0号负载TargetDataHandle.Add(ActorArray);}// 检查是否应该生成目标数据check(ShouldProduceTargetData());// 检查是否允许确认目标if (IsConfirmTargetingAllowed()){// 广播目标数据准备就绪的委托TargetDataReadyDelegate.Broadcast(TargetDataHandle);}
}
  • 将这个类生成为蓝图
    在这里插入图片描述
  • 添加两个伤害GE,一个是瞬间的伤害,一个灼烧的伤害
    在这里插入图片描述
    在这里插入图片描述
  • 在瞬间扣血的GE中添加上这个点燃后的伤害GE。套娃伤害
    在这里插入图片描述
  • 技能逻辑
    在这里插入图片描述
    在这里插入图片描述

给点燃加个Cue

  • 新建一个GameplayCueNotify_Looping蓝图,然后释放特效,记得添加标签
    在这里插入图片描述
    在这里插入图片描述
  • 然后在灼烧GE里面添加这个Cue标签
    在这里插入图片描述
  • 运行结果
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/443632.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【优选算法】(第三十二篇)

目录 ⼆进制求和&#xff08;easy&#xff09; 题目解析 讲解算法原理 编写代码 字符串相乘&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 ⼆进制求和&#xff08;easy&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;LeetCode&a…

双十一好物必买榜:数码好物推荐!

​双十一该入手一些好物来准备度过下一年&#xff0c;选择几款数码好物和工作都用得到的实用好物陪伴冬天是能够让自己更积极的迎接生活&#xff0c;能够让自己更开心满足的方式。适当的购物也是能够缓解工作压力&#xff0c;心情不好的方法&#xff0c;但依然要选择买回家不会…

团员申请书怎么写?这里归纳了一些模板

团员申请书怎么写&#xff1f;随着社会的快速发展和时代的进步&#xff0c;越来越多的青年人意识到加入团组织的重要性。作为新时代的青年&#xff0c;我们应当积极响应国家的号召&#xff0c;参与到团组织的建设中来。而想要成为共青团员&#xff0c;首先需要撰写一份规范的团…

Umi中的微前端

umi/max 内置了 Qiankun 微前端插件&#xff0c;它可以一键启用 Qiankun 微前端开发模式&#xff0c;帮助您轻松地在 Umi 项目中集成 Qiankun 微应用&#xff0c;构建出一个生产可用的微前端架构系统。 什么是微前端 微前端是一种多个团队通过独立发布功能的方式来共同构建现代…

golang grpc初体验

grpc 是一个高性能、开源和通用的 RPC 框架&#xff0c;面向服务端和移动端&#xff0c;基于 HTTP/2 设计。目前支持c、java和go&#xff0c;分别是grpc、grpc-java、grpc-go&#xff0c;目前c版本支持c、c、node.js、ruby、python、objective-c、php和c#。grpc官网 grpc-go P…

【牛客刷题实战】BC120 争夺前五名

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 牛客题目&#xff1a; BC120 争夺前五名 题目描述 输入描述&#xff1a; 输出描述&#xff1a; 示例1 示例2 解题思路&#xff1a; 具体思路&#xff1a; 题目要点&#xff1a; 完整代码&#xff1a; 兄弟们共…

python爬虫 - 数据提取

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、数据类型及其对应的提取策略 &#xff08;一&#xff09;文本数据 &…

【设计模式】软件设计原则——开闭原则里氏替换单一职责

开闭原则内容引出 开闭原则 定义&#xff1a;一个软件实体&#xff0c;类&#xff0c;函数&#xff0c;模块&#xff1b;对扩展开放&#xff0c;对修改关闭。用抽象构建框架&#xff0c;用实现扩展细节。可以提高软件的可复用性和可维护性。 开发新功能时&#xff0c;尽量不修…

猿人学— 第一届第1题(解题思路附源码)

猿人学 — 第一届第1题&#xff08;解题思路附源码&#xff09; F12进入开发者工具—> 发现停止在debugger处 —> 右键点击Never pause here后下一步 翻页&#xff0c;抓包后发现请求携带page和m两个参数&#xff0c;page应该就是页数&#xff0c;m则需要逆向 依次查…

微服务中传递公共参数,在网关层header添加参数,各子微服务,openfeign,线程池等地方拿到网关传递过来的参数

需求&#xff1a; 网关层在header中添加参数&#xff0c;header-user_id1001&#xff0c;header-user_name小明 各个子微服务&#xff0c;可以通过openfeign&#xff0c;线程池等方式拿到上面的参数1 网关层 gateway添加需要传递的参数信息 import cn.hutool.core.net.URLEnco…

MySQL从0到1基础语法笔记(下)

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 多表问题分析&#xff1a; 部门数据可以直接删除&#xff0c;然后还有部分员工…

Python对PDF文件的合并操作

在处理 PDF 文件时&#xff0c;合并多个 PDF 文件为一个单一文件或者将某个单一文件插入某个PDF文件是一个常见的需求。Python 提供了多种库来实现这一功能&#xff0c;其中 PyPDF2 是一个非常流行的选择。该库提供了简单易用的接口&#xff0c;包括 merge() 方法&#xff0c;可…

Linux系统和数据库常用的命令2

Linux系统和数据库常用的命令2 1、两台Linux机器ssh免密登录 client端登录server端需要免密&#xff0c;只需把公钥发送到server就可&#xff0c;会在server端生成一个authorized_keys文件 # 108机器上[rootclient ~]# ssh-keygen -t rsa // 非对称算法 Generating public/…

全闪 SDS 一体机提供 FC 能力承载医院核心业务

邹平市人民医院使用 X3000 SDS 一体机组建分布式存储集群&#xff0c;通过 FC 接口 与 VMware 集群连接&#xff0c;以全闪池承载核心业务&#xff0c;对象存储承载 PACS 数据&#xff0c;实现存储架构的升级改造。 “新医改”的不断推进&#xff0c;对医院的运营管理、服务质…

基础教程 | 用VuePress搭建一个简单的个人博客(附源码)

先附上自己个人博客页面&#xff1a;https://illusionno.github.io/ 源码也在这里&#xff1a;https://github.com/illusionno/my-blog &#xff08;如果觉得有帮助&#xff0c;可以点颗star✨&#xff09; 使用的主题是vuepress-theme-reco2.x&#xff0c;并在上面进行了一些调…

红外变电站分割数据集,标注为json格式,总共有5类,避雷器(289张),绝缘子(919张),电流互感器(413张),套管(161张),电压互感器(153张)

红外变电站分割数据集&#xff0c;标注为json格式&#xff0c;总共有5类 避雷器&#xff08;289张&#xff09;&#xff0c;绝缘子&#xff08;919张&#xff09;&#xff0c;电流互感器&#xff08;413张&#xff09;&#xff0c;套管&#xff08;161张&#xff09;&#xff0…

【星汇极客】单片机竞赛之2024睿抗机器人大赛-火线速递赛道(持续更新)

前言 本人是一名嵌入式学习者&#xff0c;在大学期间也参加了不少的竞赛并获奖&#xff0c;包括&#xff1a;江苏省电子设计竞赛省一、睿抗机器人国二、中国高校智能机器人国二、嵌入式设计竞赛国三、光电设计竞赛国三、节能减排竞赛国三等。 暑假的时候参加了太多的比赛&#…

设备多久(60/50/40min)未上报,类似场景发送通知实现方案

场景描述 设备比较多&#xff0c;几十万甚至上百万&#xff0c;设备在时不时会上报消息。 用户可以设置设备60分钟、50分钟、40分钟、30分钟未上报数据&#xff0c;发送通知给用户&#xff0c;消息要及时可靠。 基本思路 思路&#xff1a; 由于设备在一直上报&#xff0c;如果…

Airtest脚本的重构与优化:提升测试效率和可读性

在自动化测试的工作里&#xff0c;编写高效且易于维护的测试脚本是一项挑战&#xff0c;尤其是在应对复杂的测试场景时。Airtest作为一款常用的自动化测试工具&#xff0c;它提供了丰富的API和灵活的脚本编写方式&#xff0c;帮助测试人员高效地开展UI自动化测试。然而&#xf…

Linux的环境与历史

目录 引言 1. Linux 背景介绍 2. 开源 3. 官网 4. 企业应用现状 5. 发行版本 6.见见猪跑 引言 在这个信息化时代&#xff0c;掌握一门操作系统技能显得尤为重要。Linux作为一款开源、稳定且功能强大的操作系统&#xff0c;不仅在服务器领域占据主导地位&#xff0c;也逐渐…