UE4 伤害事件,不同部位不同伤害(C++)

可以先看射线检测

效果:
打头和身体有不同的伤害

前面设置部分:

  1. 先设置项目设置里的物理Physical Surface,添加好身体的部位

2. 添加了几个就几个变量

设置好它们的表面类型

3. 找到被伤害的那个模型的物理资产

骨骼树设置好碰撞的物理材质重载

(C++)代码:

发出伤害:

这是一个方法:


发出射线检测到后应用伤害
射线检测的HitResult有一个参数会返回被击中的物理材质,然后再通过物理材质判断其伤害

void AFPSTeachBaseCharacter::RifleLineTrace(FVector CameraLocation, FRotator CameraRotation, bool IsMoveing)
{FVector EndLocation;FVector CameraForwardVector=UKismetMathLibrary::GetForwardVector(CameraRotation);TArray<AActor*> IgnoreArray;IgnoreArray.Add(this);FHitResult HitResult;//击中的结果集if (ServerPrimaryWeapon){if (IsMoveing){}else{EndLocation = CameraLocation + CameraForwardVector * ServerPrimaryWeapon->BulletDistance;}bool HitSuccess=UKismetSystemLibrary::LineTraceSingle(GetWorld(),CameraLocation, EndLocation, ETraceTypeQuery::TraceTypeQuery1, false ,IgnoreArray,EDrawDebugTrace::None, HitResult,true,FLinearColor::Red,FLinearColor::Green,3.f);if (HitSuccess){//UKismetSystemLibrary::PrintString(GetWorld(), FString::Printf(TEXT("Hit Actor name : %s"), *HitResult.Actor->GetName()));AFPSTeachBaseCharacter* FPSCharacter=Cast<AFPSTeachBaseCharacter>(HitResult.Actor);if (FPSCharacter){//打到玩家//这里因为HitResult.PhysMaterial是一个智能指针,所以我们要加一个Get()DamagePlayer(HitResult.PhysMaterial.Get(),HitResult.Actor.Get(),CameraLocation,HitResult);}else {FRotator XRotator=UKismetMathLibrary::MakeRotFromX(HitResult.Normal);//生成广播单孔MultiSpawnBulletDecat(HitResult.Location,XRotator);}}}}

判断被击中的物理材质,计算出该部位被击中所受到的伤害

//我们不用在服务器上自己定义的那个FPSPlayerController 是因为在服务器上拿不到的  FPSPlayerController比GetController 生成要早一点,所以FPSPlayerController拿到的是空
//应用伤害,有一个回调,定义在Beginplay
//UGameplayStatics::ApplyPointDamage(DamagedActor,10,HitFromDirection,HitInfo,GetController(),this,UDamageType::StaticClass());

DamagedActor:是受到伤害的Actor
10:伤害数值
HitFromDirection:发起攻击的位置
HitInfo:发起攻击的位置旋转
GetController():发起攻击的玩家控制器
this:描述所造成的伤害的类。
UDamageType::StaticClass():实际的伤害最终会被施加到行为人身上。一个类的类类型

void AFPSTeachBaseCharacter::DamagePlayer(UPhysicalMaterial* PhysicalMaterial,AActor* DamagedActor, FVector const& HitFromDirection, FHitResult const& HitInfo)
{//5个位置的应用伤害不同if (ServerPrimaryWeapon){switch (PhysicalMaterial->SurfaceType){case EPhysicalSurface::SurfaceType1:{//head//ServerPrimaryWeapon->BaseDamage 这是自己定义的一个float伤害数值UGameplayStatics::ApplyPointDamage(DamagedActor, ServerPrimaryWeapon->BaseDamage*4, HitFromDirection, HitInfo, GetController(), this, UDamageType::StaticClass());UKismetSystemLibrary::PrintString(this, FString::Printf(TEXT("Head %s Health:%f"), *GetName(), ServerPrimaryWeapon->BaseDamage * 4));}break;case EPhysicalSurface::SurfaceType2:{//bodyUGameplayStatics::ApplyPointDamage(DamagedActor, ServerPrimaryWeapon->BaseDamage * 1, HitFromDirection, HitInfo, GetController(), this, UDamageType::StaticClass());UKismetSystemLibrary::PrintString(this, FString::Printf(TEXT("Body %s Health:%f"), *GetName(), ServerPrimaryWeapon->BaseDamage * 1));}break;case EPhysicalSurface::SurfaceType3:{//armUGameplayStatics::ApplyPointDamage(DamagedActor, ServerPrimaryWeapon->BaseDamage * 0.8, HitFromDirection, HitInfo, GetController(), this, UDamageType::StaticClass());}break;case EPhysicalSurface::SurfaceType4:{//legUGameplayStatics::ApplyPointDamage(DamagedActor, ServerPrimaryWeapon->BaseDamage * 0.7, HitFromDirection, HitInfo, GetController(), this, UDamageType::StaticClass());}break;default:break;}}//我们不用在服务器上自己定义的那个FPSPlayerController 是因为在服务器上拿不到的  FPSPlayerController比GetController 生成要早一点,所以FPSPlayerController拿到的是空//应用伤害,有一个回调,定义在Beginplay//UGameplayStatics::ApplyPointDamage(DamagedActor,10,HitFromDirection,HitInfo,GetController(),this,UDamageType::StaticClass());}

接受回调伤害

然后伤害就会通知到被攻击的Actor


(C++)
这里面的参数是从它的父类拿到的

     ***定义一个函数来接收回调的参数***UFUNCTION()
void OnHit(AActor* DamagedActor, float Damage, class AController* InstigatedBy, FVector HitLocation,class UPrimitiveComponent* FHitComponent, FName BoneName, FVector ShotFromDirection, const class UDamageType* DamageType, AActor* DamageCauser);

绑定回调:


通过回调回来的伤害进行处理就可以实现了。。

仅供参考

UE4 伤害事件,不同部位不同伤害(C++)相关推荐

  1. Day 6.重大医疗伤害事件网络舆情能量传播过程分析*———以“魏则西事件”为例

    题目: 重大医疗伤害事件网络舆情能量传播过程分析*---以"魏则西事件"为例 关键词: 网络舆情 情感扩散 社交传播 医疗伤害 能量损耗 转发峰值 摘要: [目的/意义]科学分析网 ...

  2. 伤害世界怎么自建服务器,伤害世界服务器怎么建 伤害世界服务器架设教程攻略...

    伤害世界服务器怎么建 伤害世界服务器架设教程攻略.很多玩家还不清楚伤害世界服务器怎么架设,怎么连接,下面99单机网小编给大家带来伤害世界服务器架设教程攻略,希望能帮到大家. 首先准备工作,下载服务端并 ...

  3. ue4伤害事件、应用伤害

    创建一些能让角色掉血的东西. 依旧是创建一个空Actor 然后,给个仙人掌啊,给个碰撞的盒体啊,甚至连盒体都不用,直接给仙人掌弄组件命中就行了,然后就是搞蓝图,掉血嘛 然后给静态网格体设置个默认值 然 ...

  4. UE4 后期处理体积 (角色受到伤害场景颜色变淡案例)

    在上一篇博客中(UE4 第一人称角色模板 添加生命值和调试伤害)已经完成了角色生命值减少的功能,本文在此基础上通过后期处理组件来继续增加场景颜色随着生命值减少而变淡的效果. 效果: 在按下p键来减少生 ...

  5. 学校计算机损坏和赔偿记录,校园发生伤害事故学校应该怎么处理,校园伤害事件如何判定学校过错和责任-华律网专题...

    1 校园侵权行为指的是,在学校实施的有关教育或教学的各种活动中,也包括学校开展的一些校外的活动中,以及在学校负有相关责任的时空内,由于行为人的故意或者是过失而给校内师生的人身或财产等合法权益造成不法侵 ...

  6. 伤害世界不显示服务器,伤害世界肿么开服务器

    方法/步骤 1.首先进入游戏在游戏的主要界面,按键盘的'Esc'打开游戏的设置主菜单.在游戏的设置主菜单中选择界面,然后点击'战斗信息'打开战斗信息设置界面. 2.在老版本中在该界面就可以设置战斗的相 ...

  7. 伤害世界不显示服务器,伤害世界Hurt world服务器挑选指南 不卡不清档无权限服务器挑选教程...

    类型:3D 制作大小:3.3M语言:英文 评分:10.0 标签: 立即下载 伤害世界Hurt world中的服务器太多玩家选服务器的时候不可避免的会选到一些太卡或者太多权限的服务器,下面小编就来给大家 ...

  8. 我的世界服务器武器修改伤害,我的世界改伤害指令 | 手游网游页游攻略大全

    发布时间:2016-01-27 伤害世界Hurtworld私服指令代码 伤害世界控制台秘籍.伤害世界游戏中玩家可以建立自己的私人服务器,可以在私服中使用控制台代码,下面99单机网小编给大家带来伤害世界 ...

  9. 方舟官方服务器怎么不显示伤害,方舟单人怎么显示伤害 | 手游网游页游攻略大全...

    发布时间:2016-06-11 有些玩家不太喜欢集体生活,喜欢一个人单独行动,这篇个人生存发展攻略,让你一个人也能发展的很好,后期让你杀人越货玩到爽. 有些玩家不太喜欢 ... 标签: 方舟生存进化个 ...

最新文章

  1. 判断丑数python_LintCode Python 简单级题目 517.丑数
  2. 1、MySQL数据类型简介
  3. 产品经理第一课上海站圆满结束,下一站你定!
  4. 电子计算机技能竞赛数据,2015年浙江省中等职业学校计算机应用技术专业学生职业技能大赛“计算机检测维修与数据恢复”赛项规程.doc...
  5. Chrome浏览器上传文件卡死
  6. CardView的使用
  7. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)
  8. git diff与git status
  9. 慕课软件质量保证与测试(第八章.软件评审概述)
  10. 机械制图之零件图表达
  11. c 语言入门自学app,C语言入门学习软件
  12. 磁盘配额超出 linux,Linux磁盘配额应用
  13. 大数据时代,IT行业的热门岗位有哪些?9大前景分析
  14. snprintf() 函数
  15. 计算机速成课 第三集 布尔逻辑和逻辑门
  16. 浅谈汇编器、编译器和解释器
  17. 青少年CTF Misc-Easy 女神的朋友圈 WP
  18. RT-Thread:U盘读写
  19. 北京高校应届生就业招聘信息网址
  20. 基于java-swing的开心农场游戏

热门文章

  1. 接听拨打电话没有声音而其他正常的解决办法
  2. 【实验练习】请建立简单线性回归模型,实现依据身高预测以为女性的体重,并对模型进行评估和优化。
  3. 【Linux】Linux权限管理 —— shell运行原理 | 权限 | 目录权限 | 粘滞位 | 权限掩码umask
  4. 中国网安携卫士通公司亮相2015年度密码盛会 自主密码彰显国之重器
  5. 实现Excel表格的读写操作(office,wps)
  6. Python进阶(九)Python陷阱:Nonetype
  7. 基于最短路径的物流中心选址(含Dijksra和Floyd算法)
  8. java怎么调用方法_Java怎么调用类方法
  9. c语言中的扇入与扇出题目,功能单元的最大扇入扇出工具分析.doc
  10. 让 Android 可以识别BMP图片文件,且目前Android所支持的所有图片格式