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

2023-11-05

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:
			{
				//body
				UGameplayStatics::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:
			{
					//arm
				UGameplayStatics::ApplyPointDamage(DamagedActor, ServerPrimaryWeapon->BaseDamage * 0.8, HitFromDirection, HitInfo, GetController(), this, UDamageType::StaticClass());
			}break;
			case EPhysicalSurface::SurfaceType4:
			{
					//leg
				UGameplayStatics::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);

绑定回调:
在这里插入图片描述
在这里插入图片描述
通过回调回来的伤害进行处理就可以实现了。。

仅供参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4 伤害事件,不同部位不同伤害(C++) 的相关文章

随机推荐

  • Vue-组件二次封装

    本次对el input进行简单封装进行演示 封装很简单 就给激活样式的边框 主要是功能 本次封装主要使用到vue自带的几个对象 attrs 获取绑定在组件上的所有属性 listeners 获取绑定在组件上的所有函数方法 slots 获取应用
  • String arg = input.nextLine();为什么不执行

    String a in nextLine 和String a in next 的区别 当发现String a in nextLine 不能按照自己的要求执行时 可以换为String a in next 执行 nextline读取到的是换行符
  • 06_Vue-router与综合练习

    Vue router 一 生命周期钩子函数 含义 在生命周期处理响应函数的别称 1 初始化 beforeCreat 创建对象时 没初始化data和methods created 实例已经创建好了 此时在里面发送ajax请求 2 挂载 bef
  • 自学Python兼职赚钱靠谱吗?

    自学python兼职九成九是赚不到钱的 程序员兼职的门槛是挺高的 python兼职的类型可以分为 开发 也就是写网页的底层逻辑 但是大概率需要会前端 前端也就是页面 爬虫 数据分析 兼职的话 甲方是不会把数据给你去分析的 在这个社会当中数据
  • html动态设置透明度

  • Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

    在Debian 12中 python默认为python 3 11 基于应用 现需设置虚拟环境 1 安装venv模块 从python3 3开始 配置python虚拟环境 可用venv模块 更加方便了 执行命令 apt install pyth
  • 网络安全管理

    网络安全面临的主要威胁 人为因素 系统和运行环境等 常见的互联网服务安全包括 Web浏览器安全 文件传输 FTP 服务安全 E mail服务安全 远程登录 Telnet 安全 DNS域名安全和设备的实体安全 防火墙的局限性以及风险 防火墙能
  • 编译和安装gdb源码详细步骤介绍

    1 gdb源码下载 1 源码下载网址 https ftp gnu org gnu gdb 2 本文下面的编译是按照8 2版本的源码进行的 其余版本的源码可能会报错 需要自行解决 2 编译源码 2 1 Makefile文件 顶层目录 TOOL
  • 银行业法律法规与综合能力 第四章 银行从业法律基础 25%

    第四章 银行从业法律基础 4 1 银行基本法律法规 1 考点1 中国人民银行的职能和职责 一 职能 二 职责 考点2 中国人民银行的监督管理 一 直接检查监督杈 二 建议检查监督杈 三 特定情况下的检查监督权 考点3 国务院银行业监督管理机
  • hexo引用本地图片无法显示

    最近重新开始用起hexo 但是发现在文章中引用本地图片时总是显示不出来 问题如下图所示 花费了许久时间才解决这个问题 因此将一些解决经验整理出来 希望能帮助到大家 一 插件安装与配置 首先我们需要安装一个图片路径转换的插件 这个插件名字是h
  • 2023年智慧农业与经济发展国际研讨会议(ISSAED 2023)

    2023 International Seminar on Smart Agriculture and Economic Development 地点 合肥 智慧农业 农业信息管理系统 农业物联网系统集成与实践技术 农业大数据分析与应用 农
  • LLVM学习入门(2):实现解析器 Parser 和语法树 AST

    实现解析器 Parser 和语法树 AST 2 1 The Abstract Syntax Tree AST 语法抽象树 2 2 Parser Basics 基本的解析器 2 3 Basic Expression Parsing 基本表达式
  • 计算机与不确定性原理,不确定性原理

    题目 A simple baseline for bayesian uncertainty in deep learning 摘要 本文提出了一种简单 可扩展 通用的面向深度学习的不确定性表示和标定方法SWA Gaussian SWAG 随
  • SCILAB-自由科学计算软件

    SCILAB 自由科学计算软件 原创 2006 04 03 15 05 15 发表者 phoenixlin SCILAB是由法国国家信息与自动化研究院 INRIA 的科学家们开发的 开放源码 科学计算自由软件 SCILAB一词来源于英文 S
  • Graphics2D绘制图片,线段、矩形、圆形

    新建图片 BufferedImage newImage new BufferedImage 1079 512 BufferedImage TYPE INT RGB 获取绘图对象 Graphics2D g2d newImage createG
  • 访问云服务器文件共享,访问云服务器文件共享

    访问云服务器文件共享 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 安装传输工具在本地主机和Windows云服务器上分别
  • 数组工具类

    该工具类有两个方法 1 isContained方法用来判断一个数组中是否包含另一个数组中所有的数据 2 arrayDiff方法用来删除一个数组中与另一个数组中值相同的元素 arrUtil js文件 key存在时表示是对象数据 可以不存在时表
  • Flying to the Mars(字典树)

    Flying to the Mars Time Limit 5000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 12965 A
  • 整形在内存中的存储

    目录 整形在内存中的存储 大小端字节序存储 什么是大端小端 判断大小端的代码 变量的创建是要在内存中开辟空间的 空间的大小是根据不同的类型而决定的 那接下来我们谈谈数据在所开辟内存中到底是如何存储的 整形在内存中的存储 计算机中的整数有三种
  • UE4 伤害事件,不同部位不同伤害(C++)

    UE4 伤害事件 不同部位不同伤害 C 可以先看射线检测 效果 打头和身体有不同的伤害 前面设置部分 先设置项目设置里的物理的Physical Surface 添加好身体的部位 2 添加了几个就几个变量 设置好它们的表面类型 3 找到被伤害