完整教程:UE5小游戏开发 - 武士决斗

news/2025/9/26 17:59:59/文章来源:https://www.cnblogs.com/yxysuanfa/p/19110964

效果图

(效果图)

今天的游戏很简单,在屏幕中出现叹号后双方可以按下攻击键,先按下的一方获得胜利,类似于西部牛仔对枪,讲究的就是谁在读秒之后出击更快。游戏效果如上图所示。


游戏流程

  1. 游戏开始后,两侧的角色移动进入屏幕
  2. 等待中间出现红色叹号,代表决斗开始
  3. 出现红色叹号后,尽快按下攻击键
  4. 先按下攻击的角色获胜,触发攻击效果
  5. 若在出现红色叹号前按下攻击键,则角色头上方出现红叉,游戏失败
  6. 攻击结束后短暂停留,游戏重新开始

操作方式

将一个鼠标或键盘键位绑定为攻击键,不涉及其他复杂操作


设计实现

游戏涉及到两个角色,且他们都需要有攻击、失败、提前攻击导致失败等操作和状态。因而很容易想到应该把两个角色抽出父类,父类负责实现上文中提到的公共功能。除此之外,玩家操控的角色应该绑定play controller,而电脑控制的角色应该绑定AI controller,在其他的部分均可调用同样的代码即可。

角色父类

游戏的体量不大,所以有些功能就在父类里看着方便的地方实现也不算很差的做法。

(父类EventGraph)

第一行:在该父类中大家先拿到GM,然后实现游戏流程的第一步,通过函数Slide In让两个角色滑入镜头中。再将头顶的红色叉号设置为不可见,方便后续如果提前攻击的时候展示出来表示游戏失败,结果获取一个红色叹号的引用方便后面用。

为了提升游戏的观感。就是第二行:手搓了一个滑动进入的效果,对于这种体量的游戏手搓更简便更快。在SlideInAnim该时间轴中我们每一帧都更新当前sprite的位置,这个位置是借助起点StartPos和终点EndPos计算得出的。Lerp负责返回一个A点到B点中更靠近Alpha的值,而这个Alpha是通过时间轴的曲线得到的,如下图所示,随着时间的推移Alpha的值更趋近于1。对于Lerp返回的值来说,当Alpha趋近于1时,返回的坐标趋近于B点。这样随着时间一帧一帧的流逝,允许模拟出从A点到B点的效果。我们的曲线做了平滑处理,还增加了回弹的效果,这样看起来角色会向决斗中心冲击并稍稍退回来,这样打磨细节更能提高游戏的品质。SlideIn开始连的SetPlayRate让移动更快,是在做完之后发现角色运动太慢表现效果比较差,所以加上它也

(SlideInAnim中的轨道)

第三行:当有一方攻击后会触发这个Event。我们这里创建一个枚举类型来记录游戏中的四种状态,方便做切换如下表所示。这种代表游戏状态的变量放在GM中存放是最合适的,于是这里读一下GM并且根据状态做判断。如果是Wait状态,那属于提前攻击了,这里让角色头顶的红叉显现出来让玩家知道失败了;如果是Draw说明正是应该攻击的时候,攻击后将屏幕中的红色叹号隐藏掉,并且触发SetGameFinish将枚举状态切换成Finished,之后是一个攻击动画,走到对面脸上给一刀并且切换成攻击动画这里就不详细说了,大家看就能明白。最后的AttackSucess中将输得一方切换成战败画面,并且在一段时间后重新开始游戏,蓝图如下所示。

大家今天主要探讨的内容。就是额外需要提到的一点,这游戏只有一个胜者,所以写的时候很自然的就发现需要一个标记位来做个简单的锁,就是HasbeenAttack字段。实际上目前还是有可能两个角色在同一帧攻击导致游戏崩溃,但这种几率非常非常低,而且这不

状态含义
Intro游戏刚开始
Wait等待红色叹号出现
Draw可以进行攻击
Finished有一方攻击完毕,游戏结束

(GM中的枚举字段包含的状态)

(GM中的AttackSucess函数)

第四行:当角色失败的时候执行的事件,大家在上面的这个AttackSucess里面应该也看到调用了,首要是切换图片样式和红叉显示情况。

玩家角色

第一篇文章所以简便说一下,以后这种内容就跳过了。就是这是一个很标准的player controller获取并且绑定映射,今天这

(玩家角色EventGraph)

先是获取玩家控制器,然后通过Possess将当前的这个Sprite和控制器绑定,用好理解的话说就是我们现在的灵魂Player Controller附身了这个Pawn(也就是Sprite)的身体,以后游戏一开始我们就操控这个Pawn。之所以要写这个步骤是游戏中有多个角色,我们需要手动指定一个让程序理解我们要控制哪一个角色。此处也可以设置“玩家出生点”并且在GM中指定默认Pawn,这几种做法均可。

后面写的略有重复,但这套操作比较经典。先获取Controller将类型转化为PlayerController确保获取类型无误,这个地方不要直接get Player Controller,先获取Controller再转化可以确保当前的角色不是加的什么AI Controller,避免直接get Player Controller导致程序崩溃,多转一步要的就是这个不方便,增加代码鲁棒性。后续采用增强控制器并且添加按键映射。

这个游戏是固定机位,摄像机不需要和某个角色的位置产生交互,所以后面大家创建一个固定摄像机,并且通过Set View Target with Blend来启用新增加的摄像机。

敌人角色

敌人角色由电脑控制,敌人会在可攻击之后的随机一段时间内发起攻击,具体是多久后会发起攻击需要反复尝试时间范围,这是游戏核心的体验内容,太快或太慢都会让游戏失去乐趣。

(敌人角色EventGraph)

这里绑定了一个Can Attack的广播,当可以攻击后由GM发送出来。当电脑控制的敌人收到这个事件后触发EnemyAttack事件,在一段时间的延迟后进行攻击操作。

游戏模式(GM)

负责游戏主要的流程和状态的控制。

有点后悔了,应该先写GM这样整个思路看起来可能更好理解一点。

(GM的EventGraph)

第一行:获取多个对象的引用。

第二行:我们这里自己手搓了一个简易的计时器,每一帧的时间叠加到ElapsedTime中做累计,如果累计的时间超过了RoundStartTime那么将当前游戏状态从Intro切换到Wait,此时再经过一个随机时间之后,状态再切换到Draw并发送允许攻击的广播,画面中出现红色叹号。

其他内容

其他部分首要是美术素材的切分并设置为半透明精灵效果,游戏画面中角色位置的调整,曝光调整。蓝图部分还有红色叹号作为单独的蓝图有一点点可见切换的内容,还有角色有几个函数里面做些简单的功能,此处就不一一截图列出了,详细内容请见项目工程文件。


项目源码

项目打包了,感兴趣的朋友们可以自取。

https://github.com/UsagiKnight/LightingDuel_UE5_2D_MiniGame

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/916943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡

经典三层架构项目(3-tier architecture)中应用依赖倒置原则(DIP)的理性权衡1 DIP核心思想与三层架构概述 依赖倒置原则(Dependency Inversion Principle,DIP)作为SOLID原则中的重要组成部分,其核心主张是高层模…

网站开发费入什么科目个人简介html代码简单

前言 JavaScript 的核心 ECMAScript 描述了该语言的语法和基本对象; DOM 描述了处理网页内容的方法和接口; BOM 描述了与浏览器进行交互的方法和接口。 ECMAScript、DOM 和 BOM 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一…

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE

PolarFire SOC Auto Update 和 IAP 文档阅读(三) AUTO UPDATE 文档来自:PolarFire FPGA and PolarFire SoC FPGA Programming User GuidePolarFire SOC Auto Update 和 IAP 文档阅读一 - 所长 - 博客园 PolarFire SO…

前台部分数据不显示

去数据库查了下,数据都存在,很完整,原因就在前台。 查出来的数据量很大,删除部分数据后,前台正常显示了,应该就是数据量太多,序列化的时候出问题了。 查了下,JsonConvert.SerializeObject 没有“字数”限制,但…

指针定义以及二维数组内存地址(java/c++/python)

一、指针是什么? 指针是一个存储内存地址的变量,它指向(引用)内存中的另一个数据(变量、数组、对象等)。通过指针可以直接访问或修改它所指向的内存中的数据,这使得指针成为直接操作内存的重要工具。 简单说:指…

一款不错的PDF工具,吾爱出品 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

解码数据结构线性表之顺序表

顺序表的本质与核心特性 顺序表的定义 顺序表是 “用一组内存地址连续的内存单元依次存储线性表数据元素的存储结构”,其核心是 “逻辑顺序与物理顺序完全一致”—— 即线性表中第i个元素(逻辑上),必然存储在与第i…

中电金信:源启数据集成平台全新升级,实现便捷与性能双飞跃

源启数据集成平台作为源启数据资产平台的重要组成部分,专注于实现跨源数据的高效汇聚与迁移,提供一站式数据集成服务。平台适用于银行、保险、证券、能源、制造等行业,能够实现对多源异构数据从采集、转换到写入的全…

Jupyter NoteBook / Jupyter Lab的安装与使用

Jupyter Lab是Jupyter NoteBook的下一代产品,这两个产品都是基于浏览器的代码编写、运行及文档编辑的交互式环境。Jupyter Lab是Jupyter NoteBook的下一代产品,这两个产品都是基于浏览器的代码编写、运行及文档编辑的…

完整教程:科技的温情——挽救鼠鼠/兔兔的生命

完整教程:科技的温情——挽救鼠鼠/兔兔的生命

易基因:Nat Rev Drug Discov/IF101.8:何川团队顶刊综述RNA修饰系统作为疾病治疗靶点的研究进展

近日,芝加哥大学华人科学家何川教授团队在国际顶刊《Nature Reviews Drug Discovery》(IF=101.8) 发表题为 “RNA modification systems as therapeutic targets” 的综述文章,全景式阐述了 RNA 修饰系统作为治疗靶点…

国产适配 + AI 一键生成!亿图图示 14.5 全平台绘图指南:260 种图表 + Visio 兼容,开发者 / 办公党速藏

作为开发者、产品经理或办公人士,你是否常陷入 “绘图工具跨平台不兼容”“手动画流程图耗时久”“国产系统适配难” 的困境?亿图图示 14.5 凭借 “全平台覆盖 + AI 效率升级 + 国产生态兼容” 的三重优势,直接破解…

关闭Cadence Allegro Design Entry CIS(OrCAD Capture)的Start Page

自从更新17.4补丁到某个版本,以前的用命令关闭起始页或者修改.ini文件的方法不管用了。看到启动时命令窗口里加载了一堆脚本,找到它们在D:\Cadence\SPB_17.4\tools\capture\tclscripts\capAutoLoad\路径下。由于我不…

Mini L-CTF 2025 WP

s1gn1n ida打开发现存在花指令在这里我一开始犯了一个错误我把jz和jnz进行nop没有nop C7 解释下为什么C7也要nop,因为把前面的跳转nop留下单独一条C7,CPU会继续往下读取字节,形成一个完整的指令。后面的正常的代码会…

美食网站开发与设计任务书国外移动端网站模板

近日,在 2022 云栖大会龙蜥峰会 eBPF & Linux 稳定性专场上,来自 eBPF 技术探索 SIG Maintainer 、浙江大学的郑昱笙分享了《eunomia-bpf:eBPF 轻量级开发框架》技术演讲,以下为本次演讲内容: 大家好!…

电子商务网站建设案例wordpress更改作者信息

我们上一章简单先了解了ribbonx的基本内容,以及使用举例实现自己修改ribbox的内容,本章紧接上一章,先讲解一下ribbonx的button控件。 在功能区的按钮中,可以使用内置图像或提供自已的图像,可以指定大按钮或者更小的形式,添加少量的代码甚至可以同时提供标签。此外,可以利…

K8S APIServer压力高,导致控制器Leader续约失败而重启问题

K8S APIServer压力高,导致控制器Leader续约失败而重启问题 下图是控制器Leader成功续约的日志。 这中间续约卡住了,没有成功续约的日志。从最后一次成功续约日志到重启日志,中间有2分半钟(21:07:22-23:10:03). …

【2025-09-24】连岳摘抄

23:59信任他人是一种理性、善良、有效的选择。相信人性的光明,怀抱善意与人交往,试着多给他人些理解、体谅,我们自己也能从这段关系中得到正面的回馈与成长。——彭凯平一个孩子养得好,他的未来是无限的。两重无限…

详细介绍:基于STM32F103C8T6与HC-08蓝牙模块实现手机连接方案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

外贸网站建设服务商学编程去哪个培训机构好

5 AGENTS VLN代理根据其核心特征和技术方法可分为四种主要类型:基于表示学习、基于决策和策略学习、面向任务和数据驱动。这种分类反映了VLN代理在处理多模式信息、执行复杂推理、解决数据短缺和适应环境变化方面的独特策略。每一类代理都为VLN任务的特定方面提供了解决方案…