12uec++多人游戏【自定义碰撞通道+头部暴击+连续开火】
新建一个对象通道
打开CoopGame.h,添加一个值
#define COLLISION_WEAPON ECC_GameTraceChannel1
然后在fire函数的该弹道函数里换上该参数
======================================
给武器类添加一个基础伤害成员变量
//基础伤害UPROPERTY(EditDefaultsOnly, Category = "Weapon")float BaseDamage;
在构造函数中,初始化
BaseDamage = 20;
继续完善一下fire函数
void ASWeapen::Fire()
{//创建一个撞击句柄,用来获取弹道相关信息FHitResult Hit;//弹道的起点,我们设置为角色眼睛的位置AActor * MyOwner = GetOwner();if (MyOwner){ //位置FVector EyeLocation;//方向FRotator EyeRotator;//得到眼睛的位置和角度MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);//弹道的终点就是起点+方向*10000FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);//弹道特效的结束点FVector TraceEndPoint = TraceEnd;//设置碰撞通道为可见性通道FCollisionQueryParams QueryParams;//让射线忽略玩家和枪QueryParams.AddIgnoredActor(MyOwner);QueryParams.AddIgnoredActor(this);//符合追踪设为true,可以让射击更加精准QueryParams.bTraceComplex = true;//返回命中目标的表面材质QueryParams.bReturnPhysicalMaterial = true;//在创建一个单轨迹线来计算弹道//LineTraceSingleByChannel击中物体返回trueif (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams)){//命中对象AActor * HitActor = Hit.GetActor();//实际的伤害float ActualDamage = BaseDamage;//得到命中物体表面材质EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());//如果命中的是头部表面材质,伤害变成四倍if (SurfaceType == SURFACE_FLESHVULNERABLE){ActualDamage *= 4;}//调用伤害函数//参数分别为伤害对象、基础伤害、设计方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)//this(伤害者) 和伤害类型 UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);//根据材质的不同,进行不同的处理UParticleSystem * SelectedEffect = nullptr;switch (SurfaceType){//这两种情况是一个效果case SURFACE_FLESHDEFAULT:case SURFACE_FLESHVULNERABLE:SelectedEffect = FleshImpactEffect;break;default:SelectedEffect = DefaultImpactEffect;break;}//生成特效在命中点//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向if (SelectedEffect){UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());}//命中的时候,修改弹道特效的终点TraceEndPoint = Hit.ImpactPoint;}//方便debugDrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);//射击特效PlayFireEffects(TraceEndPoint);}}
为了验证,其伤害效果,我们在靶子的蓝图编辑事件
测试
====================================
武器类里面声明两个函数
//开始射击函数void StartFire();//停止设计函数void StoptFire();
再声明几个变量
//计时器句柄FTimerHandle TimerHandle_TimeBetweenShots;//上次开火时间点float FireLastTime;//开火的频率,每分钟多少枪UPROPERTY(EditDefaultsOnly, Category = "Weapon")float RateOfFire;//开火的间隔时间float TimeBetweenShots;
在构造函数中初始化RateOfFire
RateOfFire = 600;
然后在游戏开始函数里,算得开火间隔
// Called when the game starts or when spawned
void ASWeapen::BeginPlay()
{Super::BeginPlay();TimeBetweenShots = 60 / RateOfFire;
}
在fire函数的最下面,记录最后开火的时间
void ASWeapen::Fire()
{//创建一个撞击句柄,用来获取弹道相关信息FHitResult Hit;//弹道的起点,我们设置为角色眼睛的位置AActor * MyOwner = GetOwner();if (MyOwner){ //位置FVector EyeLocation;//方向FRotator EyeRotator;//得到眼睛的位置和角度MyOwner->GetActorEyesViewPoint(EyeLocation, EyeRotator);//弹道的终点就是起点+方向*10000FVector TraceEnd = EyeLocation + (EyeRotator.Vector() * 1000);//弹道特效的结束点FVector TraceEndPoint = TraceEnd;//设置碰撞通道为可见性通道FCollisionQueryParams QueryParams;//让射线忽略玩家和枪QueryParams.AddIgnoredActor(MyOwner);QueryParams.AddIgnoredActor(this);//符合追踪设为true,可以让射击更加精准QueryParams.bTraceComplex = true;//返回命中目标的表面材质QueryParams.bReturnPhysicalMaterial = true;//在创建一个单轨迹线来计算弹道//LineTraceSingleByChannel击中物体返回trueif (GetWorld()->LineTraceSingleByChannel(Hit, EyeLocation, TraceEnd, COLLISION_WEAPON, QueryParams)){//命中对象AActor * HitActor = Hit.GetActor();//实际的伤害float ActualDamage = BaseDamage;//得到命中物体表面材质EPhysicalSurface SurfaceType = UPhysicalMaterial::DetermineSurfaceType(Hit.PhysMaterial.Get());//如果命中的是头部表面材质,伤害变成四倍if (SurfaceType == SURFACE_FLESHVULNERABLE){ActualDamage *= 4;}//调用伤害函数//参数分别为伤害对象、基础伤害、设计方向、命中信息(命中句柄)、MyOwner->GetInstigatorController(暂时不了解)//this(伤害者) 和伤害类型 UGameplayStatics::ApplyPointDamage(HitActor, ActualDamage, EyeRotator.Vector(), Hit, MyOwner->GetInstigatorController(), this, DamageType);//根据材质的不同,进行不同的处理UParticleSystem * SelectedEffect = nullptr;switch (SurfaceType){//这两种情况是一个效果case SURFACE_FLESHDEFAULT:case SURFACE_FLESHVULNERABLE:SelectedEffect = FleshImpactEffect;break;default:SelectedEffect = DefaultImpactEffect;break;}//生成特效在命中点//ImpactEffect:特效 ImpactPoint:打击点 Rotation():打击方向if (SelectedEffect){UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), SelectedEffect, Hit.ImpactPoint, Hit.ImpactNormal.Rotation());}//命中的时候,修改弹道特效的终点TraceEndPoint = Hit.ImpactPoint;}//方便debugDrawDebugLine(GetWorld(), EyeLocation, TraceEnd, FColor::Red, false, 1, 0, 1);//射击特效PlayFireEffects(TraceEndPoint);//最后开火的时间FireLastTime = GetWorld()->TimeSeconds;}}
实现这两个函数
void ASWeapen::StartFire()
{float FirstDelay = FMath::Max(0.0f, FireLastTime + TimeBetweenShots - GetWorld()->TimeSeconds);GetWorldTimerManager().SetTimer(TimerHandle_TimeBetweenShots, this, &ASWeapen::Fire, TimeBetweenShots, true, FirstDelay);
}void ASWeapen::StoptFire()
{GetWorldTimerManager().ClearTimer(TimerHandle_TimeBetweenShots);
}
然后在玩家类里也声明两个函数
//开始射击函数void StartFire();//停止设计函数void StoptFire();
之前的fire函数就不要了
然后定义函数
void ASCharacter::StartFire()
{if (CurrentWeapen1){CurrentWeapen1->StartFire();}
}void ASCharacter::StoptFire()
{if (CurrentWeapen1){CurrentWeapen1->StoptFire();}
}
绑定开火
//开火PlayerInputComponent->BindAction("Fire", IE_Pressed, this, &ASCharacter::StartFire);PlayerInputComponent->BindAction("Fire", IE_Released, this, &ASCharacter::StoptFire);
12uec++多人游戏【自定义碰撞通道+头部暴击+连续开火】相关推荐
- UE427Object碰撞通道
UE427Object碰撞通道 新建Object Channels 通道: 在DefaultEngine.ini文件里看到新建的ToolkitGizmo: 设置碰撞通道: 调用:加粗样式 参考:UE4 ...
- 自定义Xcode 文件头部的注释
在Xcode10中新建文件,系统会自动在新建文件的头部添加注释模板,如下: 有时候我们可能有特殊的需求想要自定义这些注释,在Xcode9之后,苹果也给我们提供了方法,可以很方便的修改这些默认注释. 1 ...
- Stanford UE4 UE5 C++ 开发 课程笔记(三)子弹物理碰撞与弹道校正
Stanford UE4 & UE5 C++ 开发 课程笔记(三) 子弹物理碰撞与弹道校正 物理碰撞 1. 防止碰撞体 2. 自定义碰撞通道 3. 在Projectile蓝图类中设置碰撞 效果 ...
- ue4蓝图碰撞检测的类型_UE4_自定义相机碰撞组件
相比较UE4自带的SpringArm中的碰撞,主要特点在于前后推进速度不一样 在碰撞时 向前推进的速度较快,在离开碰撞时 向后退的速度较慢 SpringArm自带的碰撞检测 SpringArm的碰撞检 ...
- Metal 框架之自定义设置渲染通道
概述 渲染通道是一系列渲染命令,用于绘制一组纹理.本示例执行一对渲染通道来渲染视图的内容.对于第一个通道,示例创建了一个自定义渲染,将图像渲染成纹理.这个通道是一个离屏渲染通道,因为样本渲染为普通纹理 ...
- Unity 自定义脚本模板 添加头部注释
自定义模板的一些问题 其实有很多文章都写了自定义模板,添加头部注释,例如这篇文章. 都是要找到untiy 自己的模板c# txt,然后写入相关的替代码,在匹配更换,其中的问题: 当换电脑,或者unit ...
- el-table表格头部内容自定义
el-table表格头部内容自定义 在使用element UI中的表格组件进行开发时,表格头部的内容是通过设置<el-table-column>组件的label属性进行赋值,使用label ...
- Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。
Fullcalendar这个插件挺好,就是很多方法感觉官方文档也没怎么说,导致上手难度大,而且有些默认事件真的不太友好...废话不多说,先上效果图! 1.效果GIF 1.1 基本按钮功能 1.2 事 ...
- UE4 FBX静态网格物体通道
On this page: 概述 一般设置 支点 三角化 UV 贴图坐标 创建法线贴图 材质 碰撞 警告和注意事项 顶点颜色 导出网格物体 导入网格物体 静态网格物体LOD LOD设置 导出LOD 导 ...
最新文章
- ubuntu卸载openjdk-11
- Swift5版本以上#selector报错解决
- es6 Class 不存在变量提升
- 智能家居助手后台系统原型/智慧家居后台管理系统/应用分析/页面分析/设备分析/用户管理/运营管理/权限管理/系统设置/问题反馈/商城管理/消息管理/用户画像/公告管理/账号画像/留存用户/数据埋点
- 主页所停留的时间实现交互
- C# 实现复杂对象的序列化与反序列化
- 1462 通往奥格瑞玛的道路
- Learn Git Branching 学习笔记(基础篇)
- TP5 微信分享朋友圈接口显示自定义图片和标题
- codeforces1567B
- 安全模式检测计算机,win7如何以安全模式修复计算机系统? ,您会在阅读后知道...
- 用手机模拟加密门禁卡【不用电脑】
- 《Windows 程序设计(第3版)》——导读
- 您为什么要加入CSDN个人空间
- 支付宝手机网站支付开发记录之结果异步通知
- Runc容器运行过程及容器逃逸原理
- 计算机病毒的关键技术,计算机病毒实验系统关键技术研究与实现
- 论文笔记_Optimal Brain Damage
- 西瓜书课后题——第十一章(特征选择与稀疏学习)
- Java 生成随机密码
热门文章
- android获取后一天日期,android获取本周本月本年的第一天和最后一天
- 根式进入计算机的方法
- POJ3889Fractal Streets 递归+ 坐标变换
- RLC并联谐振电路分析
- 二层技术——点对点协议ppp以及NBMA网络MGRE的tunnel隧道技术以及二层综合实验
- 盘点业务流程的SAP操作调整
- ROM、RAM、FLASH、IRAM、IROM、DRAM、DROM等简单介绍
- 基于stm32的grbl写字机器人(添加舵机支持)
- 【T+】畅捷通T+软件取消凭证记账时,提示“入库失败,至少输入2个字”
- Zabbix Server trapper两个命令注入漏洞(CVE-2017-2824和CVE-2020-11800)