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):制作第一人称射击游戏相关推荐

  1. UE4创建第一人称射击游戏学习教程

    Unreal Engine 4: Create Your Own First-Person Shooter MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言 ...

  2. 【历史上的今天】12 月 10 日:世界上第一位程序员诞生;Ada 语言发布;第一人称射击游戏的开拓者

    整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来. 今天是 2021 年 12 月 10 日,在 120 年前的今天,瑞典国王和挪威诺贝尔基金会首次颁发了诺贝尔奖.根据诺贝尔 ...

  3. 利用Python制作第一人称射击小游戏 含源代码

    大家好 我是毕加锁 (锁!) 今天教大家利用Python制作第一人称小游戏 涉及知识点 1.sprites 2.pygame混音器 3.图章    4.python基础语法 .代码 1发射声 from ...

  4. u3d5第一人称射击游戏(C#脚本)完整版并在iOS9.3系统上真机运行

    参考资料:<Unity3D\2D手机游戏开发>(第二版) +   百度 涉及U3D的功能有:摄像机控制.物理.动画.智能寻路等. 开发工具:Unity3D5.3.4,VS2015,VMpl ...

  5. UE4创建第一人称射击游戏学习教程 Unreal Engine 4: Create Your Own First-Person Shooter

    UE4创建第一人称射击游戏学习教程 本课程包含38节视频课,将逐步指导您完成以下主题: 云桥网络 平台获取课程! 如何创建6种可定制的武器(包括手枪.突击步枪.猎枪.狙击枪.榴弹发射器和火箭发射器) ...

  6. 【UE4 第一人称射击游戏】08-使用“AK47”发射子弹

    上一篇: [UE4 第一人称射击游戏]07-添加"AK47"武器 本节效果: 步骤: 1.在"Blueprints"文件夹内添加一个Actor蓝图,命名为&qu ...

  7. unity3D第一人称射击游戏(推荐)

    unity3d第一人称射击游戏(推荐) 第一部分:简介   这个教程中,我们详细了解下如何制作一个简单的第一人称射击游戏(FPS).其中将介绍一些基本的3D游戏编程的概念和一些关于怎样如游戏程序员般思 ...

  8. Unity3D FPS Game:第一人称射击游戏(一)

    耗时一周制作的第一人称射击游戏,希望能帮助到大家! 由于代码较多,分为三篇展示,感兴趣的朋友们可以点击查看! Unity3D FPS Game:第一人称射击游戏(一) Unity3D FPS Game ...

  9. java第一人称射击_[转] Unity实践 --- 第一人称射击游戏_

    一. 环境 地图资源,包含了全地图以及灯光.天空盒子. 扩展部分. 不可穿透的部分需要在bake时设置为static. 二. 设置 1. 相机 1> 主相机 挂载控制视角的c#组件. tag为m ...

最新文章

  1. 深度学习在目标视觉检测中的应用进展与展望
  2. bzoj 1095: [ZJOI2007]Hide 捉迷藏
  3. php纯面向过程--论坛
  4. 总结:ps aux指令
  5. ul去掉li前面的点_一年级语文上册期末考点:拼音重、难点总结,全面,建议收藏...
  6. c语言pop逆置单链表,C语言实现单链表
  7. Android 实用开源控件
  8. @SpringBootApplication揭秘
  9. 4011-基于邻接表的深度优先遍历(C++,取巧做法)
  10. 懒人看执行计划神器 for Oracle
  11. r语言 list添加_R语言里面双层list变成长形数据框
  12. 依码仕喷码机编程指南
  13. Android开发 入门篇(一)
  14. 以《数据安全法》为背景的全息数据安全解决方案
  15. Jenkins配置slaver节点
  16. Linux配置本地yum源(光盘镜像挂载)
  17. 使用python计算三角形面积
  18. java爬虫(本地爬虫和网络爬虫)
  19. 【关于ChatGPT的30个问题】26、ChatGPT的开发团队是谁?/ By 禅与计算机程序设计艺术
  20. VB学习第四周续--四位整数逆序

热门文章

  1. 七月就业班强势来袭~
  2. vue 循环出来的三个标签加不同的颜色
  3. chrome怎样编辑html页面大小,使用Chrome DevTools实时编辑HTML和CSS
  4. Yearning SQL审计平台 定制化修改
  5. mysql 查找 法语字母_Mysql使用可选的法语字符搜索LIKE
  6. 1到10加法创新图片-走迷宫_纽约楼市寒冬,曼哈顿房价创新低,为何上季度交易却反弹?...
  7. 动画animationend 事件在活动红包雨中的应用
  8. 机器人控制器编程教学进度表
  9. labview mysql库下载,(最新整理)LabVIEW与数据库的链接-精选资料
  10. nodejs爬取视频网页信息并使用