UE4C++(10):制作第一人称射击游戏
10/15/2020
文章目录
- 添加日志消息
- 游戏模式(AGameModeBase)
- 角色类(Pawn)
- 为什么使用C++还要使用蓝图
- 注意事项!
- 实现发射物
- 创建球体碰撞组件
- 发射物运动组件
- 实现射击
- 抛射物碰撞预设
- 碰撞响应、碰撞处理
- 增加碰撞代理
- 增加准星(HUD类)
- 参考资料
添加日志消息
if (GEngine)
{// 显示调试信息五秒。 // -1"键"值(首个参数)说明我们无需更新或刷新此消息。GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, TEXT("Hello World, this is FPSGameMode!"));
}
- 建议别放在Tick函数中
- 最好用在StartPlay或者BeginPlay函数里面
- GEngine表示游戏引擎,继承于UObject
游戏模式(AGameModeBase)
定义游戏规则:
- 玩家加入游戏的条件,比如初级场,高级场等等
- 游戏暂停和关卡过渡
- 获胜条件
- 等等游戏特定的行为
默认的游戏模式最主要的是分配Classes专栏
- 游戏状态
- 玩家控制器
- HUD 界面
- 默认玩家属性和行为
- 等等
角色类(Pawn)
- Character表示双足站立的人物
- 创建C++类FPSCharacter
- 设置轴映射,即按键操作,WASD表示移动,鼠标左键开火,空格跳跃
- 实现角色移动函数并绑定到移动组件
// 调用后将功能绑定到输入
void AFPSCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent)
{Super::SetupPlayerInputComponent(PlayerInputComponent);// 设置"移动"绑定。PlayerInputComponent->BindAxis("MoveForward", this, &AFPSCharacter::MoveForward);PlayerInputComponent->BindAxis("MoveRight", this, &AFPSCharacter::MoveRight);
}
InputComponent 是定义如何处理输入数据的组件。InputComponent 可附加到需要接收输入的 actor。
BindAxis 和BindAction 绑定了一个委托函数到项目设置中定义的行为或者轴
为什么使用C++还要使用蓝图
因为蓝图可以可视化操作,C++加载一个模型后,并不能直接看到模型的样子,最重要的是模型的初始位置和朝向的调整是很难确定的,同时摄像机的视图也需要仔细调整!
注意事项!
当你对C++的某些Component的属性进行重写的时候,它并不会更新已经生成的蓝图类,比如加入你已经拥有了一个FPSCharacter的蓝图类,现在C++想要隐藏骨骼模型
GetMesh()->SetOwnerNoSee(true);
蓝图类Renderring下的Owner No See 属性将会有一个恢复默认设置的标志,这个标志表示C++里面设置了默认情形,但需要手动调整。如果你生成了一个新的蓝图类,将会直接赋值默认属性。
实现发射物
创建球体碰撞组件
UPROPERTY(VisibleDefaultsOnly, Category = Projectile)USphereComponent* CollisionComponent; //即蓝图中的Sphere Collision// 使用球体代表简单碰撞。CollisionComponent = CreateDefaultSubobject<USphereComponent>(TEXT("SphereComponent"));// 设置球体的碰撞半径。CollisionComponent->InitSphereRadius(15.0f);// 将碰撞组件设为根组件。RootComponent = CollisionComponent;
发射物运动组件
// 发射物运动组件。
UPROPERTY(VisibleAnywhere, Category = Movement)
UProjectileMovementComponent* ProjectileMovementComponent;// 使用此组件驱动该发射物的运动。
ProjectileMovementComponent = CreateDefaultSubobject<UProjectileMovementComponent>(TEXT("ProjectileMovementComponent"));
ProjectileMovementComponent->SetUpdatedComponent(CollisionComponent);
ProjectileMovementComponent->InitialSpeed = 3000.0f;
ProjectileMovementComponent->MaxSpeed = 3000.0f;
ProjectileMovementComponent->bRotationFollowsVelocity = true;
ProjectileMovementComponent->bShouldBounce = true;
ProjectileMovementComponent->Bounciness = 0.3f;// 在发射方向上设置发射物初速度的函数。
void AFPSProjectile::FireInDirection(const FVector& ShootDirection)
{ProjectileMovementComponent->Velocity = ShootDirection * ProjectileMovementComponent->InitialSpeed;
}
实现射击
定义发射物生成的位置或方向
// 定义生成的发射物类,人物生成发射物
UPROPERTY(EditDefaultsOnly, Category = Projectile)
TSubclassOf<class AFPSProjectile> ProjectileClass;
// 从摄像机位置的枪口偏移,即方位
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Gameplay)
FVector MuzzleOffset;//实现射击
void AFPSCharacter::Fire()
{// 尝试发射物体。if (ProjectileClass) //在蓝图中会给一个蓝图子弹类,带有模型的{// 获取摄像机变换。FVector CameraLocation;FRotator CameraRotation;GetActorEyesViewPoint(CameraLocation, CameraRotation);// 将 MuzzleOffset 从摄像机空间变换到世界空间。FVector MuzzleLocation = CameraLocation + FTransform(CameraRotation).TransformVector(MuzzleOffset);FRotator MuzzleRotation = CameraRotation;// 将准星稍微上抬。MuzzleRotation.Pitch += 10.0f;UWorld* World = GetWorld();if (World){FActorSpawnParameters SpawnParams;SpawnParams.Owner = this;SpawnParams.Instigator = Instigator;// 在枪口处生成发射物。AFPSProjectile* Projectile = World->SpawnActor<AFPSProjectile>(ProjectileClass, MuzzleLocation, MuzzleRotation, SpawnParams);if (Projectile){// 设置发射物的初始轨道。FVector LaunchDirection = MuzzleRotation.Vector();Projectile->FireInDirection(LaunchDirection);}}}
}
抛射物碰撞预设
Edit->Project Setting->Engine->Collision
CollisionComponent->BodyInstance.SetCollisionProfileName(TEXT("Projectile"));InitialLifeSpan = 3.0f; //子弹的声明周期
碰撞响应、碰撞处理
// 发射物命中物体时调用的函数。
UFUNCTION()
void OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit);// 发射物命中物体时调用的函数。
void AFPSProjectile::OnHit(UPrimitiveComponent* HitComponent, AActor* OtherActor, UPrimitiveComponent* OtherComponent, FVector NormalImpulse, const FHitResult& Hit)
{if (OtherActor != this && OtherComponent->IsSimulatingPhysics()){OtherComponent->AddImpulseAtLocation(ProjectileMovementComponent->Velocity * 100.0f, Hit.ImpactPoint);}
}
- 碰撞的不是自己同时被碰撞到的组件模拟了物理
- 被碰撞到的组件增加一个冲量
增加碰撞代理
CollisionComponent->OnComponentHit.AddDynamic(this, &AFPSProjectile::OnHit);
增加准星(HUD类)
// 将在屏幕中央绘制此项。
UPROPERTY(EditDefaultsOnly)
UTexture2D* CrosshairTexture;void AFPSHUD::DrawHUD()
{Super::DrawHUD();if (CrosshairTexture){// 找到画布中心。FVector2D Center(Canvas->ClipX * 0.5f, Canvas->ClipY * 0.5f);// 纹理维度进行一半偏移,使纹理中心和画布中心对齐。FVector2D CrossHairDrawPosition(Center.X - (CrosshairTexture->GetSurfaceWidth() * 0.5f), Center.Y - (CrosshairTexture->GetSurfaceHeight() * 0.5f));// 在中心点绘制准星。FCanvasTileItem TileItem(CrossHairDrawPosition, CrosshairTexture->Resource, FLinearColor::White);TileItem.BlendMode = SE_BLEND_Translucent;Canvas->DrawItem(TileItem);}
}
参考资料
UE4官网第一人称射击
UE4C++(10):制作第一人称射击游戏相关推荐
- UE4创建第一人称射击游戏学习教程
Unreal Engine 4: Create Your Own First-Person Shooter MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言 ...
- 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者
整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...
- 利用Python制作第一人称射击小游戏 含源代码
大家好 我是毕加锁 (锁!) 今天教大家利用Python制作第一人称小游戏 涉及知识点 1.sprites 2.pygame混音器 3.图章 4.python基础语法 .代码 1发射声 from ...
- u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行
参考资料:<Unity3D\2D手机游戏开发>(第二版) + 百度 涉及U3D的功能有:摄像机控制.物理.动画.智能寻路等. 开发工具:Unity3D5.3.4,VS2015,VMpl ...
- UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter
UE4创建第一人称射击游戏学习教程 本课程包含38节视频课,将逐步指导您完成以下主题: 云桥网络 平台获取课程! 如何创建6种可定制的武器(包括手枪.突击步枪.猎枪.狙击枪.榴弹发射器和火箭发射器) ...
- 【UE4 第一人称射击游戏】08-使用“AK47”发射子弹
上一篇: [UE4 第一人称射击游戏]07-添加"AK47"武器 本节效果: 步骤: 1.在"Blueprints"文件夹内添加一个Actor蓝图,命名为&qu ...
- unity3D第一人称射击游戏(推荐)
unity3d第一人称射击游戏(推荐) 第一部分:简介 这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思 ...
- Unity3D FPS Game:第一人称射击游戏(一)
耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...
- java第一人称射击_[转] Unity实践 --- 第一人称射击游戏_
一. 环境 地图资源,包含了全地图以及灯光.天空盒子. 扩展部分. 不可穿透的部分需要在bake时设置为static. 二. 设置 1. 相机 1> 主相机 挂载控制视角的c#组件. tag为m ...
最新文章
- 深度学习在目标视觉检测中的应用进展与展望
- bzoj 1095: [ZJOI2007]Hide 捉迷藏
- php纯面向过程--论坛
- 总结:ps aux指令
- ul去掉li前面的点_一年级语文上册期末考点:拼音重、难点总结,全面,建议收藏...
- c语言pop逆置单链表,C语言实现单链表
- Android 实用开源控件
- @SpringBootApplication揭秘
- 4011-基于邻接表的深度优先遍历(C++,取巧做法)
- 懒人看执行计划神器 for Oracle
- r语言 list添加_R语言里面双层list变成长形数据框
- 依码仕喷码机编程指南
- Android开发 入门篇(一)
- 以《数据安全法》为背景的全息数据安全解决方案
- Jenkins配置slaver节点
- Linux配置本地yum源(光盘镜像挂载)
- 使用python计算三角形面积
- java爬虫(本地爬虫和网络爬虫)
- 【关于ChatGPT的30个问题】26、ChatGPT的开发团队是谁?/ By 禅与计算机程序设计艺术
- VB学习第四周续--四位整数逆序
热门文章
- 七月就业班强势来袭~
- vue 循环出来的三个标签加不同的颜色
- chrome怎样编辑html页面大小,使用Chrome DevTools实时编辑HTML和CSS
- Yearning SQL审计平台 定制化修改
- mysql 查找 法语字母_Mysql使用可选的法语字符搜索LIKE
- 1到10加法创新图片-走迷宫_纽约楼市寒冬,曼哈顿房价创新低,为何上季度交易却反弹?...
- 动画animationend 事件在活动红包雨中的应用
- 机器人控制器编程教学进度表
- labview mysql库下载,(最新整理)LabVIEW与数据库的链接-精选资料
- nodejs爬取视频网页信息并使用