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

这篇具有很好参考价值的文章主要介绍了Stanford UE4 & UE5 C++ 开发 课程笔记(三)子弹物理碰撞与弹道校正。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

物理碰撞

Unreal中两个物体碰撞需要两方预设的碰撞通道中对方对应的类型都设置为Block

1. 防止碰撞体

在场景中设置一个cube,并将其进行适当拉伸:

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

选中放置好的cube,在 Collision中将Collision Presets设为Custom,并将每一项置为Block

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

注意cube的默认类型是WorldStatic

2. 自定义碰撞通道

Project Setting -> Engine -> Collision -> Preset中添加新的通道,并命名为Projectile

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

具体设置如下图:

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

3. 在Projectile蓝图类中设置碰撞

打开Projectile蓝图类,选中SphereComponent,将Collision Preset 设置为上一步自定义的类型:

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

效果

编译后,查看效果

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

4. 设置子弹碰撞后爆炸

为了更加符合实际,需要实现让子弹碰到墙壁后爆炸,属于On Component Hit事件:

  1. 判断发射对象,碰撞的物体不能是发射子弹的人(自己)。
  2. 获取当前子弹在场景中的具体方位。
  3. 在对应位置生成一个爆炸效果,具体类型是P_Gideon_Primary_HitWorld
  4. 最后,摧毁当前子弹。

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

效果

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

弹道校正

1. 原理

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

可以通过Unreal提供的LineTraceByChannel方法检测被阻挡点的位置。

2. 校正前

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

3. 校正后

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

4. 实现

在屏幕中添加准星

新建Widget,命名为Crosshair_Widget

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

在HUD中插入一个Image。这里如果没有虚线方框,需要自己在HUD中先添加一个Canvas

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

在右侧Image属性栏校准位置:

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

在PlayerCharacter蓝图类中添加当前UI:

uec++学习笔记(二)运动和物理碰撞,Unreal学习笔记,ue4,ue5,虚幻引擎5,c++

校正弹道

更新在第二篇笔记中编写的 PrimaryAttack_TimeElapsed 函数:

void ALCharacter::PrimaryAttack_TimeElapsed()
{
	// 生成角度和坐标
	// 获取人物模型中手的坐标,GetSocketLocation可以获取骨骼中的插件
	const FVector HandLocation = GetMesh()->GetSocketLocation("Muzzle_01");
	// 未校正前的生成方位
	// const FTransform SpawnTM = FTransform(GetControlRotation(), HandLocation);
	FActorSpawnParameters SpawnParams;
	// 无论任何情况都生成(无视重叠,碰撞,覆盖...)
	SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn;
	// 将角色自身作为触发者传入,以便子弹判断正确的交互对象
	SpawnParams.Instigator = this;

	// 碰撞参数,忽略自身
	FCollisionQueryParams Params;
	Params.AddIgnoredActor(this);

	// 获取Camera组件
	APlayerCameraManager* CurrentCamera = GetWorld()->GetFirstPlayerController()->PlayerCameraManager;
	// 方向是摄像机视角的正前方(屏幕正中央),这里不要把手部模型的坐标传入,方向会偏
	FVector TraceDirection = CurrentCamera->GetActorForwardVector();
	// 起始位置是摄像机的位置
	FVector TraceStart = CurrentCamera->GetCameraLocation();
	// 终点是一段距离,后面的5000不固定
	FVector TraceEnd = TraceStart + (TraceDirection * 5000);
	
	FHitResult Hit;
	// Line Trace检测与障碍物的撞击点
	if (GetWorld()->LineTraceSingleByChannel(Hit, TraceStart, TraceEnd, ECC_GameTraceChannel1, Params))
	{
		// 将撞击点作为方向向量的终点位置
		TraceEnd = Hit.ImpactPoint;
	}
	// 起始点是我们的子弹生成点(手),终点是目标点,获得Rotation
	FRotator ProjRotation = (TraceEnd - HandLocation).Rotation();
	// 最终获得校正后的生成方位
	FTransform SpawnTM = FTransform(ProjRotation, HandLocation);
	
	// 在世界中生成
	GetWorld()->SpawnActor<AActor>(ProjectileClass, SpawnTM, SpawnParams);
	
}

更新代码后编译,就可以实现正确的弹道。文章来源地址https://www.toymoban.com/news/detail-606295.html

到了这里,关于Stanford UE4 & UE5 C++ 开发 课程笔记(三)子弹物理碰撞与弹道校正的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • UE4运用C++和框架开发坦克大战教程笔记(十三)(第40~42集)

    上节课实现了按键绑定系统的 4 种基础绑定,这节课来实现多按键事件的绑定。 我们为多按键绑定额外编写一个类 InputBinder 。 DDMessage.h DDMessage.cpp 依旧是部署好 DDMessage – DDModule – DDOO – 对象 这条调用链。 DDModule.h DDModule.cpp DDOO.h 为了避免出现忘记注销事件指针导致访问错

    2024年02月03日
    浏览(33)
  • UE4运用C++和框架开发坦克大战教程笔记(十四)(第43~45集)

    继续来补充根据资源类型生成资源的逻辑,在 DDWealth 里添加获取 URL 的方法。 DDWealth.h DDWealth.cpp 建立 DDWealth – DDModule – DDOO – 对象 的调用链。 DDModule.h DDModule.cpp DDOO.h DDOO.cpp 如果编译通过则说明写好了,现在所有的对象都可以通过这两个方法获取目标资源的 URL。刚刚写的

    2024年02月03日
    浏览(29)
  • 【UE5】交互式展厅数字博物馆交互是开发实战课程

    长久以来,我们总是不断被初学者问到类似这样的问题:如何从头到尾做一个交互式程序开发项目?本套课程尝试对这个问题进行解答。 课程介绍视频如下 【UE5】数字展厅交互式开发全流程 【谁适合学习这门课】 本套课程面向初学者,满足学习需求包括但不仅限于以下:

    2024年01月18日
    浏览(41)
  • 【UE4 塔防游戏系列】06-炮塔发射子弹攻击敌人

    1. 新建一个Actor蓝图类,命名为“TotalBulletsCategory”,用来表示子弹蓝图总类,后面会有很多不同类型的子弹会继承该类 打开“TotalBulletsCategory”,添加粒子系统组件、盒体碰撞组件和发射物移动组件  调整发射物重力范围为0 添加一个变量,命名为“ChoosedEnemy”,用来表示子

    2024年02月17日
    浏览(26)
  • 【UE4 塔防游戏系列】07-子弹对敌人造成伤害

    目录 效果 步骤 一、让子弹拥有不同伤害 二、敌人拥有不同血量  三、修改“BP_TowerBase”逻辑 四、发射的子弹对敌人造成伤害   一、让子弹拥有不同伤害 为了让每一种子弹拥有不同的伤害值,打开“TotalBulletsCategory”(所有子弹的父类),新建一个浮点型变量,命名为“

    2024年02月16日
    浏览(25)
  • 初学UE5,UE4的教程适用UE5吗?

    UE5是最近推出的一款游戏引擎,相较于UE4而言,它有着更好的性能和灵活的工作流程,同时也引入了一些新的功能。对于一些游戏开发初学者来说,他们可能会想知道,是否可以通过UE4的教程来学习UE5。在这里,我们将介绍一下这个问题。 首先,UE5和UE4之间确实存在一些相通

    2024年02月06日
    浏览(40)
  • UE5 UDP通信 UE4.21-UE5.1

    目录 客户端,发送数据 1.建立字符串变量UDPConnection,绑定连接事件  2.连接初始化  3.发送数据  4.关闭UDP服务  服务器,接收数据 1.绑定连接事件  2.绑定数据接收事件  3.开启UDP服务  4.返回数据  5.关闭UDP服务   需要提供远程端IP地址和端口号 0.0.0.0表示监听所有ip,端口

    2024年02月15日
    浏览(33)
  • UE4/UE5 动画控制

    工程下载 ​ ​​​​​​​​​​​​​https://mbd.pub/o/bread/ZJ2cm5pu   蓝图控制sequence播放/倒播动画: 设置开启鼠标指针,开启鼠标事件 在场景中进行过场动画制作 设置控制事件

    2024年02月09日
    浏览(37)
  • ue5 物理场的应用

    ue5.3 使用技巧 前置背景 此处用物理场 作为全局的风场来用,风场就需要每帧场的数据是有变化的 就有两种方法 第一种 在beiginplay钟设置 president 用wave 自动有变化,弊端就是变化太过于规律化 第二种 在tick中 设置 transion 用noise  ,变换 transform 用r.PhysicsField.SingleTarget =1 设置

    2024年02月09日
    浏览(29)
  • UE4 UE5 一直面向屏幕

                        一直面相屏幕,方法很简单 新建一个蓝图,如下添加组件: 蓝图如下: Rotation Actor :需要跟随镜头旋转的物体 Update:一个timeline(替代event tick 只是为了循环) Timeline: 蓝图直接可以复制:网址

    2024年02月04日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包