新建一个对象通道

打开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++多人游戏【自定义碰撞通道+头部暴击+连续开火】相关推荐

  1. UE427Object碰撞通道

    UE427Object碰撞通道 新建Object Channels 通道: 在DefaultEngine.ini文件里看到新建的ToolkitGizmo: 设置碰撞通道: 调用:加粗样式 参考:UE4 ...

  2. 自定义Xcode 文件头部的注释

    在Xcode10中新建文件,系统会自动在新建文件的头部添加注释模板,如下: 有时候我们可能有特殊的需求想要自定义这些注释,在Xcode9之后,苹果也给我们提供了方法,可以很方便的修改这些默认注释. 1 ...

  3. Stanford UE4 UE5 C++ 开发 课程笔记(三)子弹物理碰撞与弹道校正

    Stanford UE4 & UE5 C++ 开发 课程笔记(三) 子弹物理碰撞与弹道校正 物理碰撞 1. 防止碰撞体 2. 自定义碰撞通道 3. 在Projectile蓝图类中设置碰撞 效果 ...

  4. ue4蓝图碰撞检测的类型_UE4_自定义相机碰撞组件

    相比较UE4自带的SpringArm中的碰撞,主要特点在于前后推进速度不一样 在碰撞时 向前推进的速度较快,在离开碰撞时 向后退的速度较慢 SpringArm自带的碰撞检测 SpringArm的碰撞检 ...

  5. Metal 框架之自定义设置渲染通道

    概述 渲染通道是一系列渲染命令,用于绘制一组纹理.本示例执行一对渲染通道来渲染视图的内容.对于第一个通道,示例创建了一个自定义渲染,将图像渲染成纹理.这个通道是一个离屏渲染通道,因为样本渲染为普通纹理 ...

  6. Unity 自定义脚本模板 添加头部注释

    自定义模板的一些问题 其实有很多文章都写了自定义模板,添加头部注释,例如这篇文章. 都是要找到untiy 自己的模板c# txt,然后写入相关的替代码,在匹配更换,其中的问题: 当换电脑,或者unit ...

  7. el-table表格头部内容自定义

    el-table表格头部内容自定义 在使用element UI中的表格组件进行开发时,表格头部的内容是通过设置<el-table-column>组件的label属性进行赋值,使用label ...

  8. Fullcalendar日历使用,包括视图选择、事件插入、编辑事件、事件状态更改、事件添加和删除、事件拖动调整,自定义头部,加入el-popover显示图片、图片预览、添加附件链接等,支持手机显示。

    Fullcalendar这个插件挺好,就是很多方法感觉官方文档也没怎么说,导致上手难度大,而且有些默认事件真的不太友好...废话不多说,先上效果图! 1.效果GIF 1.1 基本按钮功能 1.2  事 ...

  9. UE4 FBX静态网格物体通道

    On this page: 概述 一般设置 支点 三角化 UV 贴图坐标 创建法线贴图 材质 碰撞 警告和注意事项 顶点颜色 导出网格物体 导入网格物体 静态网格物体LOD LOD设置 导出LOD 导 ...

最新文章

  1. ubuntu卸载openjdk-11
  2. Swift5版本以上#selector报错解决
  3. es6 Class 不存在变量提升
  4. 智能家居助手后台系统原型/智慧家居后台管理系统/应用分析/页面分析/设备分析/用户管理/运营管理/权限管理/系统设置/问题反馈/商城管理/消息管理/用户画像/公告管理/账号画像/留存用户/数据埋点
  5. 主页所停留的时间实现交互
  6. C# 实现复杂对象的序列化与反序列化
  7. 1462 通往奥格瑞玛的道路
  8. Learn Git Branching 学习笔记(基础篇)
  9. TP5 微信分享朋友圈接口显示自定义图片和标题
  10. codeforces1567B
  11. 安全模式检测计算机,win7如何以安全模式修复计算机系统? ,您会在阅读后知道...
  12. 用手机模拟加密门禁卡【不用电脑】
  13. 《Windows 程序设计(第3版)》——导读
  14. 您为什么要加入CSDN个人空间
  15. 支付宝手机网站支付开发记录之结果异步通知
  16. Runc容器运行过程及容器逃逸原理
  17. 计算机病毒的关键技术,计算机病毒实验系统关键技术研究与实现
  18. 论文笔记_Optimal Brain Damage
  19. 西瓜书课后题——第十一章(特征选择与稀疏学习)
  20. Java 生成随机密码

热门文章

  1. android获取后一天日期,android获取本周本月本年的第一天和最后一天
  2. 根式进入计算机的方法
  3. POJ3889Fractal Streets 递归+ 坐标变换
  4. RLC并联谐振电路分析
  5. 二层技术——点对点协议ppp以及NBMA网络MGRE的tunnel隧道技术以及二层综合实验
  6. 盘点业务流程的SAP操作调整
  7. ROM、RAM、FLASH、IRAM、IROM、DRAM、DROM等简单介绍
  8. 基于stm32的grbl写字机器人(添加舵机支持)
  9. 【T+】畅捷通T+软件取消凭证记账时,提示“入库失败,至少输入2个字”
  10. Zabbix Server trapper两个命令注入漏洞(CVE-2017-2824和CVE-2020-11800)