毕业设计(论文)
博主可接毕设论文!!!
论文题目:基于C#、Unity的先行者技能熟练度游戏系统的设计与实现
摘 要
随着数字娱乐产业的蓬勃发展,独立游戏因其创新性和独特的游戏体验而受到越来越多玩家的喜爱。在这样的背景下,本课题旨在探讨独立游戏开发中的关键技术和创新设计方法。通过对《魔介之石:先行者》这一横板2D闯关游戏的开发过程的研究,旨在为独立游戏开发提供实践指导和理论参考。
本课题的主要工作集中在游戏设计和开发的几个关键方面。首先,实现了一个复杂的技能熟练度系统,允许玩家通过依次按下不同的按键来触发技能,并且反复使用特定技能来提高熟练度,减少触发技能的按键的数量以及解锁更高级的技能和效果。该系统不仅增加了游戏的深度,也提高了玩家的参与度。其次,论文详细介绍了游戏的咏唱系统和无咏唱魔法系统的设计和实现,这些系统为玩家提供了多样化的战斗选择。在技术实现方面,本论文详细探讨了Unity游戏引擎的应用,包括其物理引擎的使用,以及如何利用C#编程语言来实现游戏逻辑。此外,本文还探讨了在游戏开发过程中遇到的挑战和解决方案,特别是在技能系统设计、用户界面交互和多平台适配等方面的工作。这些内容不仅展示了游戏开发的具体过程,也为后续同类型游戏的开发提供了经验和技术指导。
整个游戏实现了基本的横板2D的游戏框架,并且在此基础上实现了技能熟练度系统,和非完全击败的敌人掉落系统,经测试,系统运行稳定,具有良好的拓展性和稳定性,能够满足正常游玩的要求。
关键词:Unity,C#,技能系统
“Magic Air: Faster Mover” The Design and Implementation of a Skill Proficiency Game System
Abstract
As the digital entertainment industry flourishes, independent games are increasingly favored by players for their innovation and unique gaming experience. Against this backdrop, this thesis aims to explore key technologies and innovative design methods in independent game development. Through the study of the development process of the side-scrolling 2D action game "Magic Stone of Induction: Pathfinder", this work aims to provide practical guidance and theoretical reference for independent game development.
The main work of this thesis focuses on several key aspects of game design and development. First, a complex skill proficiency system is implemented, allowing players to trigger skills by pressing different keys in sequence and to increase proficiency by repeatedly using specific skills. This reduces the number of keys required to trigger skills and unlocks more advanced skills and effects. This system not only adds depth to the game but also enhances player engagement. Second, the paper details the design and implementation of the game's chanting system and non-chanting magic system, offering players diverse combat options. In terms of technical implementation, the paper thoroughly explores the application of the Unity game engine, including the use of its physics engine, and how to implement game logic using the C# programming language. Additionally, the paper discusses challenges and solutions encountered in the game development process, especially in skill system design, user interface interaction, and cross-platform adaptation. These contents not only showcase the specific process of game development but also provide experience and technical guidance for the development of subsequent games of the same type.
Key words: Unity, C#, Skill System
摘 要 II
Abstract III
第1章 绪 论 1
1.1 课题背景 1
1.2 目的与意义 1
1.3 论文研究主要内容 2
1.4 国内外研究现状 2
第2章 关键技术介绍 4
2.1 Unity游戏引擎 4
2.2 C#编程语言 4
2.3 物理引擎 4
第3章 需求分析 5
3.1 业务需求 5
3.2 玩家功能性需求分析 6
3.2.1控制移动 6
3.2.2控制跳跃 6
3.2.3读取按键 7
3.2.4技能释放 7
3.2.5收集掉落物 8
3.2.6开启菜单 8
3.3 敌人功能性需求分析 8
3.3.1血量管理 9
3.3.2追逐玩家 9
3.4 系统运转环境 10
3.5 系统开发环境 10
3.6 系统原型 10
3.6.1 咏唱系统原型图 10
3.6.2 魔介石概念原型图 10
3.7 人物原画 11
3.7.1 业希的原画 11
3.7.2塔洛兹的原画 12
3.8 系统可行性分析 12
第4章 系统设计 14
4.1 体系结构设计 14
4.2 数据库设计 14
4.3后台功能模块设计 17
4.3.1 玩家功能模块设计 17
4.3.2 敌人功能模块设计 18
4.4 时序图 18
第5章 系统实现 20
5.1 玩家功能模块实现 20
5.1.1 读取玩家按键功能模块实现 20
5.1.2 寻找对应技能功能模块实现 21
5.1.3 玩家技能释放功能模块实现 22
5.1.4 玩家移动功能模块实现 24
5.1.5 玩家释放跟踪飞弹模块实现 25
5.2 敌人模块实现 28
5.2.1 敌人受击模块实现 28
5.2.2 敌人移动模块实现 31
5.3 系统开发难点 32
第6章 系统测试 33
6.1 功能测试 33
6.1.1 玩家功能模块测试 33
6.1.2 敌人模块测试 33
6.2 测试结论 34
第7章 结 论 35
参考文献 36
致 谢 37
第1章 绪 论
1.1 课题背景
随着随着技术的飞速发展和玩家群体的不断扩大,游戏行业正在经历前所未有的变革。从虚拟现实(VR)和增强现实(AR)技术的引入,到人工智能(AI)和云游戏服务的应用,游戏行业正迎来新的技术浪潮。这些技术不仅改变了游戏的玩法,也提高了玩家对互动性和沉浸感的期待。然而,尽管游戏形式的多样化和技术的进步为创新提供了空间,许多游戏的核心玩法依然停留在传统模式上,特别是在技能系统的设计上往往缺乏创新。因此,《魔介之石:先行者》的独特设计理念——一个全新的技能熟练度系统,应运而生。它不仅挑战了传统游戏的常规做法,还旨在更深层次地吸引玩家,提供一种全新的、深度的游戏体验。
同时,现代玩家群体呈现出多样化的需求,从休闲玩家到硬核玩家,他们对游戏内容、挑战难度和沉浸感有着各自的期待。为了满足这些多元化的需求,《魔介之石:先行者》在游戏设计上引入了非完全击败的敌人掉落系统,这不仅为游戏战斗增添了更多策略元素,还让不同水平的玩家都能在游戏中找到适合自己的挑战和乐趣。
1.2 目的与意义
本课题的核心目的是探索并验证全新的游戏玩法系统,旨在突破传统游戏机制的局限,为玩家提供更丰富的互动体验。引入的技能熟练度和敌人掉落系统,不仅增强了游戏的可玩性和策略深度,还为不同水平的玩家提供了定制化的挑战。这种系统设计,更容易使玩家达到心流状态,从而提升游戏的吸引力和玩家的留存率。在当前游戏市场竞争激烈、玩家需求多样化的情况下,这种创新的游戏设计理念和机制可能为整个游戏行业带来新的发展方向。此外,这些系统的引入,不仅能够改变玩家对传统游戏的认知,也有望成为其他独立游戏开发者的灵感源泉,推动整个行业朝着更加多元化和个性化的方向发展。课题是对全新的游戏玩法系统的一次探索与验证,这两个系统能够提高游戏的可玩性,适应不同玩家的水平,同时会比传统游戏在技能提升方面更容易产生心流。此外,这些系统的引入不仅能够改变玩家对传统游戏的看法,还可能激发其他独立游戏开发者的创意灵感,推动整个行业向更多元化和个性化的方向发展。
1.3 论文研究主要内容
完成了一个基于Unity的横板2D的角色扮演游戏,此项目包含传统2D游戏的基本功能框架,并在此基础上设计并实现技能熟练度系统,同时研究此系统以及其相关系统所带来游戏体验的变化。
- 技能熟练度系统
此系统包含熟练度系统和技能释放系统,技能释放系统预计包含2种方式。
① 咏唱模块:玩家通过按下一定顺序的按键来模拟咏唱,咏唱完成后会调用对应的技能,最后通过鼠标以及鼠标左键来决定瞄准释放的位置。
② 无咏唱模块:玩家通过按下最少顺序的按键来调用相应技能,调用好相应的技能后,继续按下注入魔力的按键可以向此技能注入魔力,从而增加此技能的效果,同时根据主角的魔力控制力等参数来决定技能的随机摇摆幅度,以此来模拟控制不住技能的情况,最后过鼠标以及鼠标左键来决定瞄准释放的位置,如果魔力量太多导致超过主角魔力控制力则会造成偏移。
- 非完全击败的敌人掉落系统
玩家可选择重点攻击敌人的不同部位,击败后获取相应装备材料,引入战术选择和资源管理元素。
两个核心新玩法融合进传统的2D横板游戏,探寻新玩法的可玩性。
1.4 国内外研究现状
国内游戏产业近年来经历了迅猛发展,主要集中在移动游戏、社交游戏以及电子竞技等领域。技术研究上,越来越多的国内游戏公司开始关注AI技术的应用,如利用机器学习进行游戏测试和玩家行为分析。此外,虚拟现实(VR)和增强现实(AR)技术在国内游戏产业中的应用也日渐增多。市场研究方面,国内学者和行业分析师对游戏用户的消费行为、游戏设计的社会文化影响进行了深入研究。在政策层面,对游戏内容的审查和监管在近年来也成为了研究热点,特别是针对未成年人保护和防沉迷系统的建立。
在国际范围内,游戏研究是一个融合了计算机科学、心理学、艺术设计和社会学的领域。特别是在美国、欧洲和日本,大学和研究机构长期致力于游戏技术进步、游戏文化综合分析以及游戏超越娱乐目的的使用(教育或培训等领域)。在游戏设计领域,越来越多的研究着重于探讨游戏叙事、角色代入感及其对玩家情感影响的研究。游戏心理学研究则探讨游戏对于玩家心理健康的影响,包括游戏成瘾、暴力行为等。在技术层面,云游戏、人工智能在游戏中的应用、以及新型交互方式(例如,基于手势的控制系统)是国外研究的热点话题。此外,电子竞技作为一个快速增长的领域,也吸引了大量的研究兴趣,包括竞技策略、玩家训练和电子竞技市场的商业模式。
第2章 关键技术介绍
2.1 Unity游戏引擎
Unity游戏引擎在游戏开发界享有盛誉,不仅因其强大的跨平台能力,也因其对开发者友好的设计。Unity支持从简单的2D游戏到复杂的3D环境,满足各种游戏类型的需求。这得益于Unity的高级渲染引擎,它支持最新的图形技术,如实时光线追踪,为游戏带来电影级别的视觉效果。Unity的编程接口简洁而强大,允许开发者快速实现想法。此外,Unity的编辑器环境是高度可定制的,它允许开发者通过插件和扩展来优化他们的工作流程。Unity的资产商店是其另一个重要优势,它提供了海量的资源,如模型、纹理、音效和脚本库,这些资源加速了开发过程,并使得高质量的游戏开发更加易于达成。Unity的社区活跃且支持广泛,从业余爱好者到专业开发团队都在此交流心得,共享技术和经验。
2.2 C#编程语言
C#语言在Unity中的应用使得游戏开发过程更加直观和高效。它的语法清晰,适合编写结构化和模块化的代码,这在大型游戏项目中尤为重要。C#的面向对象特性,如类继承、接口和多态性,为游戏设计提供了极大的灵活性和可扩展性。C#还具有强大的错误处理能力,其异常处理机制能有效避免游戏运行时的崩溃。随着游戏开发越来越依赖于网络和社交功能,C#中的网络编程功能也显得格外重要,它能帮助开发者轻松实现多人在线游戏和社交互动功能。此外,C#在跨平台开发中的可移植性,使得开发者能够针对不同的硬件和操作系统平台开发游戏,无需对底层代码进行大量修改。
2.3 物理引擎
Unity的物理引擎提供了模拟真实世界物理行为的细致工具,这不仅包括碰撞检测和响应,还包括刚体动力学和约束系统。刚体动力学使得游戏对象能以真实的方式运动,如滚动、摔落和反弹,而约束系统则允许开发者创建复杂的机械结构,如铰链和弹簧。这在模拟车辆、建筑崩塌和物理谜题方面非常有用。物理引擎还包含高级的功能,如布料模拟和流体动力学,使得游戏世界的环境和角色服饰能够以逼真的方式反应和交互。此外,Unity的物理引擎还提供了对虚拟现实(VR)和增强现实(AR)游戏的优化支持,为这些沉浸式体验增添了真实感。这种对现实世界物理的精确模拟,不仅增强了游戏的真实性和可信度,也为游戏设计带来了无限的可能性和创意空间。
第3章 需求分析
3.1 业务需求
用户点击《魔介之石:先行者》,进入开始游戏界面,点击开始游戏则进入游戏,在挑战开始前可以进行作战准备,提升技能熟练度,准备好后开始挑战关卡,在战斗过程中大型敌人的部分部位可能掉落材料,这时可以进行战术选择,可以选择收集战利品回到安全区继续准备,也可以选择继续挑战,挑战成功后游戏结束,点击退出按钮即可退出游戏。流程图如图3.1所示。
图3.1 游戏流程图
3.2 玩家功能性需求分析
根据需求调研,玩家用例图如图 3.2 所示。
图3.2 玩家用例图
3.2.1控制移动
控制移动用例描述如表3.1所示。
表3.1 控制移动用例描述
用例名称 | 移动 | |
参与者 | 玩家 | |
用例概述 | 玩家使用该用例完成相对世界坐标左右位移的功能 | |
前置条件 | 玩家已经开始游戏,且未死亡 | |
后置条件 | 游戏结束 | |
基本事件流 | 参与者动作 | 系统响应 |
1.玩家按下键盘AD键。 | 2.响应并让游戏角色依据按键方向运动。 | |
备选事件流 |
b.系统限制角色移动范围 |
3.2.2控制跳跃
控制跳跃用例描述如表3.2所示。
表3.2 控制跳跃用例描述
用例名称 | 跳跃 |
参与者 | 玩家 |
用例概述 | 玩家使用该用例完成相对世界坐标向上位移的功能 |
前置条件 | 玩家已经开始游戏,在地面上,且未死亡 |
后置条件 | 跳跃 |
续表3.2 控制跳跃用例描述
基本事件流 | 参与者动作 | 系统响应 |
1.玩家按下键盘空格键键。 | 2.响应并给游戏角色施加一个向上的力。 | |
备选事件流 |
b.系统限制角色移动范围 |
3.2.3读取按键
读取按键用例描述如表3.3所示。
表3.3 读取按键用例描述
用例名称 | 读取按键 | |
参与者 | 玩家 | |
用例概述 | 玩家使用该用例完成读取按键并搜索技能的功能 | |
前置条件 | 玩家已经开始游戏,且未死亡 | |
后置条件 | 游戏结束 | |
基本事件流 | 参与者动作 | 系统响应 |
1.玩家按下技能按键顺序前半段。 5.玩家按下技能按键顺序后半段。 | 2.系统读取按键并按顺序保存在临时列表中。 3.系统根据临时列表前半段搜索对应的魔法类型。 4.系统把对应的魔法类型索引保存在临时变量里。 5.系统根据魔法类型索引和按键顺序后半段搜索对应的魔法。 6.系统把对应的魔法索引保存在临时变量里。 | |
备选事件流 |
b.系统清除临时列表和索引 |
3.2.4技能释放
技能释放用例描述如表3.4所示。
表3.4 技能释放用例描述
用例名称 | 技能释放 | |
参与者 | 玩家 | |
用例概述 | 玩家使用该用例完成技能释放的功能 | |
前置条件 | 技能索引已被找到。 | |
后置条件 | 玩家释放游戏角色的魔法技能,消耗魔力值。 | |
基本事件流 | 参与者动作 | 系统响应 |
1.玩家用鼠标进行瞄准。 2.玩家点击鼠标左键。 | 3.系统获取当前鼠标位置。 4.系统获取玩家当前位置。 5.系统计算玩家指向鼠标位置的向量。 6.系统根据技能索引找到对应的魔法。 |
续表3.2 技能释放用例描述
7.系统实例化对应的魔法技能游戏对象。 8.系统调整魔法技能游戏对象的方向为玩家指向鼠标位置的向量方向。 | ||
备选事件流 | 3a.当玩家按下鼠标右键,系统清除技能索引 |
3.2.5收集掉落物
收集掉落物用例描述如表3.5所示。
表3.5 收集掉落物用例描述
用例名称 | 收集掉落物 | |
参与者 | 玩家 | |
用例概述 | 玩家已进入游戏 | |
前置条件 | 玩家的物品库存中增加了新物品 | |
后置条件 | 玩家可以收集掉落物 | |
基本事件流 | 参与者动作 | 系统响应 |
1.玩家击败敌人或敌人的部分部位。 2.玩家点击或移动到物品上收集物品。 | 3.系统将收集的物品添加到玩家的库存 | |
备选事件流 | 无 |
3.2.6开启菜单
开启菜单用例描述如表3.6所示。
表3.6 开启菜单用例描述
用例名称 | 开启菜单 | |
参与者 | 玩家 | |
用例概述 | 菜单没有开启 | |
前置条件 | 菜单开启并显示 | |
后置条件 | 用户可以开启菜单键获取多功能 | |
基本事件流 | 参与者动作 | 系统响应 |
1.用户按下键盘ESC键 | 2.响应按键操作,开启菜单 | |
备选事件流 | 无 |
3.3 敌人功能性需求分析
根据需求调研,敌人用例图如图 3.3 所示。
图3.3 敌人用例图
3.3.1血量管理
血量管理功能描述用例描述如表3.7所示。
表3.7 血量管理用例描述
用例名称 | 血量管理 | |
参与者 | 敌人 | |
用例概述 | 敌人使用该用例完成减少血量的功能 | |
前置条件 | 玩家已经开始游戏,且未死亡,同时敌人存在 | |
后置条件 | 敌人血量减少 | |
基本事件流 | 参与者动作 | 系统响应 |
1.敌人受到攻击 | 2.系统判断敌人血量大于0。 3.系统获取攻击对象的伤害。 4.系统把敌人血量减去伤害。 5.更新敌人血量。 | |
备选事件流 | 3a.敌人血量小于等于0,终止流程。 |
3.3.2追逐玩家
追逐玩家功能描述用例描述如表3.8所示。
表3.8 追逐玩家用例描述
用例名称 | 追逐玩家 | |
参与者 | 敌人 | |
用例概述 | 敌人朝玩家方向移动 | |
前置条件 | 玩家在敌人检测范围内,敌人血量大于0 | |
后置条件 | 敌人血量减少 | |
基本事件流 | 参与者动作 | 系统响应 |
续表3.2 追逐玩家用例描述
1.玩家进入敌人的追逐检测范围内。 | 2.系统获取玩家当前位置。 3.系统计算敌人朝向玩家的向量。 4.使用向量进行移动。 | |
备选事件流 |
3.4 系统运转环境
装有Windows 7以上操作系统的PC设备。
硬件环境(包含及以上): i5-4590、GTX970TI、8GB RAM、20GB DISK。
3.5 系统开发环境
硬件环境:i5-6700、显卡GTX 1060、内存24GB。
软件环境:Windows 10-64位、Unity 2022.3.6f1c1。
3.6 系统原型
3.6.1 咏唱系统原型图
玩家依次按下一定的按键顺序,系统寻找对应技能,鼠标瞄准左键释放技能,原型图如图3.4所示。
图3.4 咏唱系统原型图
3.6.2 魔介石概念原型图
魔介石概念原型图如图3.5 所示。
图3.5 魔介石概念原型图
3.7 人物原画
3.7.1 业希的原画
主角业希的原画草图如图3.6 所示。
图3.6 主角业希的原画草图
3.7.2塔洛兹的原画
NPC向导塔洛兹的原画草图如图3.7 所示。
图3.7 塔洛兹的原画草图
3.8 系统可行性分析
1. 技能熟练度系统: 技能熟练度系统的实现在技术上是完全可行的。利用Unity游戏引擎的灵活性和C#语言的功能,可以创建一个用户友好且响应快速的技能系统。该系统需要能够跟踪玩家对不同技能的使用频率,并相应地调整技能的性能和效果。利用Unity的内置物理和动画系统,可以实现视觉上吸引人且直观的技能表现。这要求有一定的算法设计能力,以确保技能熟练度的准确计算和合理的技能进步曲线。
2. 非完全击败的敌人掉落系统: 这个系统要求游戏能够识别和响应玩家对敌人特定部位的攻击,并根据这些交互来决定掉落物品。这在Unity中通过碰撞检测系统和刚体组件来实现是可行的。此系统的关键在于设计一个灵活的敌人模型和掉落逻辑,使得不同的攻击结果能够产生不同的掉落效果。该系统需要精细的设计来保证平衡性和公平性。
总的来说,《魔介之石:先行者》的技术实现是可行的。主要的挑战在于资源的分配和优化以及确保游戏机制的平衡性和玩家体验的流畅性。考虑到Unity强大的功能和广泛的支持社区,以及C#语言的可靠性,有信心这些技术挑战可以被有效地解决。
第4章 系统设计
4.1 体系结构设计
下图为系统结构图,如图4.1所示。
图4.1 系统结构图
玩家可以通过按键从技能库调用相应的技能,技能库再返回玩家对应的技能,玩家释放魔法会与敌人进行交互。
4.2 数据库设计
本系统的ER图如图4.2所示。
图4.2 系统E-R图
系统ER图由玩家、敌人、基础魔法、持续魔法、地图5张表构成。
玩家表结构如表4.1所示。
表4.1 玩家表
字段名 | 名称 | 数据类型 | 约束 |
Health | 生命值 | Float | not null |
MaxHealth | 最大生命值 | Float | not null |
RecoverMana | 每秒恢复生命值 | Float | not null |
Mana | 魔力值 | Float | not null |
MaxMana | 最大魔力值 | Float | not null |
RecoverMana | 每秒恢复魔力值 | Float | not null |
Speed | 速度 | Float | not null |
玩家信息表中输入的字段内容为生命值、最大生命值、每秒恢复生命值、魔力值、每秒恢复魔力值、速度,该表存储的是玩家的基本信息。
敌人表结构如表4.2所示。
表4.2 敌人表
字段名 | 名称 | 数据类型 | 约束 |
Name | 名字 | String | Not null |
Health | 生命值 | Float | not null |
MaxHealth | 最大生命值 | Float | not null |
Mana | 魔力值 | Float | not null |
MaxMana | 最大魔力值 | Float | not null |
Speed | 速度 | Float | not null |
Attack | 攻击力 | Float | not null |
Deference | 防御力 | Float | not null |
AIStation | 状态 | Int | not null |
Place | 部位 | Gameobject | not null |
玩家信息表中输入的字段内容为名字、生命值、最大生命值、魔力值、最大魔力值、速度、攻击力、防御力、状态、部位,该表存储的是敌人的基本信息。
基础魔法表结构如表4.3所示。
表4.3 基础魔法表
字段名 | 名称 | 数据类型 | 约束 |
Name | 名字 | String | not null |
MagicId | 魔法编号 | Int | not null |
Attack | 伤害值 | Float | not null |
KeyOrder | 按键顺序 | String | not null |
DepleteMana | 消耗魔力值 | Float | not null |
Speed | 速度 | Float | not null |
LifeTime | 生命时间 | Float | not null |
玩家信息表中输入的字段内容为名字、魔法编号、伤害值、按键顺序、消耗魔力值、速度、生命时间,该表储存的是基础魔法的基本数据
持续魔法表结构如表4.4所示。
表4.4 持续魔法表
字段名 | 名称 | 数据类型 | 约束 |
Name | 名字 | String | not null |
MagicId | 魔法编号 | Int | not null |
Attack | 伤害值 | Float | not null |
KeyOrder | 按键顺序 | String | not null |
DepleteMana | 消耗魔力值 | Float | not null |
Speed | 速度 | Float | not null |
PersistentTime | 持续时间 | Float | not null |
IntervalTime | 间隔时间 | Float | not null |
玩家信息表中输入的字段内容为名字、魔法编号、伤害值、按键顺序、消耗魔力值、速度、持续时间、间隔时间,该表储存的是持续魔法的基本数据
关卡表结构如表4.5所示。
表4.5 关卡表
字段名 | 名称 | 数据类型 | 约束 |
Level | 关卡编号 | Int | not null |
MapName | 地图名字 | String | not null |
Map | 地图信息 | String | not null |
关卡表字段为关卡编号,包含地图名地图信息。
4.3后台功能模块设计
4.3.1 玩家功能模块设计
玩家功能模块的类图如图4.3所示。
图4.3 玩家系统的类图
玩家模块包括玩家移动、读取玩家按键、搜索对应魔法、玩家瞄准目标、玩家释放魔法技能等功能。
4.3.2 敌人功能模块设计
敌人功能的类图如图4.4所示。
图4.4 敌人系统的类图
敌人模块包含敌人检测碰撞、敌人受到伤害、敌人死亡销毁、敌人受击变颜色等功能。
4.4 时序图
玩家调用魔法控制器的时序图如图4.5所示。
图4.5 玩家输入按键顺序释放魔法时序图
第5章 系统实现
5.1 玩家功能模块实现
5.1.1 读取玩家按键功能模块实现
读取玩家按下的按键,同时把按键转化成数字并保存在keySequence里,若玩家超过1秒没有继续输入按键则清除keySequence并重置魔法索引。读取按键功能模块实现相关 C#代码 如下图所示。
void ReadKeyInput()
{
// 遍历配置的按键并检查是否被按下
for (int i = 0; i < configurableKeys.Length; i++)
{
if (Input.GetKeyDown(configurableKeys[i]))
{
// 将按键转换为数字,这里简单地使用索引
keySequence.Add(i + 1); // 加1使得数字从1开始
FindMagic();
// 重置时间,因为有新按键输入
timeSinceLastKeyPress = 0f;
// 打印当前按键和对应的数字 (可选,用于调试)
//Debug.Log($"Key Pressed: {configurableKeys[i]} - Number: {i + 1}");
}
}
// 打印当前按键序列,用于调试
if (keySequence.Count >= 3){Debug.Log("Current key sequence: " + string.Join(", ", keySequence));}
// 如果超过1秒没有新按键输入,则清除按键列表
if (timeSinceLastKeyPress > 1.0f)
{
keySequence.Clear();
// 重置时间和魔法索引
timeSinceLastKeyPress = 0f;
ClearIndex();
//Debug.Log("Key sequence cleared due to timeout.");
} }
图5.1 读取玩家按键
5.1.2 寻找对应技能功能模块实现
并保玩家输入按键会把按键顺序保存在按键顺序列表里,玩家输入前半段的按键后,魔法库会根据输入的前半段按键来返回魔法类型的索引,玩家输入后半段按键后,魔法库会根据输入的后半段按键和魔法类型索引来返回魔法类型对应的魔法的索引。寻找对应技能功能模块实现相关 C#代码 如下图所示。
void FindMagic()
{
if (keySequence == null || keySequence.Count < 1)
{
return;
}
// 确保 magicLibraryData 已经被分配
if (magicLibraryData == null)
{
Debug.LogError("MagicLibraryData is not assigned in MagicController.");
return; // 如果 magicLibraryData 是 null,则退出方法
}
if (magicTypeIndex == -1)
{
magicTypeIndex = magicLibraryData.FindMagicTypeIndex(keySequence);
}
else
{
magicIndex = magicLibraryData.MagicTyp[magicTypeIndex].FindMagicTypeIndex(keySequence);
}
// 检查是否找到匹配的魔法类型
if (magicTypeIndex != -1)
{
Debug.Log("Found Magic Type at index: " + magicLibraryData.MagicTyp[magicTypeIndex].name);
// 找到魔法类型
if(magicIndex != -1)
{
Debug.Log("Found Magic at index: " + magicLibraryData.MagicTyp[magicTypeIndex].Magic[magicIndex].name);
}
} //搜索匹配的魔法类型
public int FindMagicTypeIndex(List<int> keySequence)
{
for (int i = 0; i < MagicTyp.Length; i++)
{
if (AreKeySequencesEqual(MagicTyp[i].MagicTyp_keySequence, keySequence))
{
return i; // 找到匹配的魔法类型,返回下标
}
}
return -1; // 如果没有找到匹配的,返回-1
}
根据按键寻找对应技能功能如图5.2 所示。
图5.2 寻找对应技能
5.1.3 玩家技能释放功能模块实现
玩家通过鼠标瞄准并按下鼠标左键,实例化索引对应的魔法对象,计算玩家位置指向鼠标位置的坐标向量,并且调整魔法对象方向为结果向量的方向。技能释放功能模块实现相关 C#代码 如下图所示。
void CastMagic(GameObject Caster,GameObject magicPrefab)
{
if (Caster == null || magicPrefab == null)
{
Debug.Log("NO magicPrefab or Caster!!!");
return;
}
Debug.Log(magicPrefab);
// 魔法释放的具体逻辑
if (magicPrefab != null)
{
// 将鼠标位置从屏幕坐标转换为世界坐标
Vector3 mouseScreenPosition = Input.mousePosition; // 鼠标屏幕位置
// 相机到z = 0平面的距离
float distanceToZeroZPlane = Mathf.Abs(cameraMain.transform.position.z);
// 设置鼠标位置的z轴值为相机到z = 0平面的距离
mouseScreenPosition.z = distanceToZeroZPlane;
// 转换为世界坐标
Vector3 mouseWorldPosition = cameraMain.ScreenToWorldPoint(mouseScreenPosition);
//Debug.Log("Mouse World Position: " + mouseWorldPosition);
// 确保z坐标与游戏物体保持一致
mouseWorldPosition.z = Caster.transform.position.z;
// 实例化魔法Prefab
GameObject magic = Instantiate(magicPrefab, Caster.transform.position, Quaternion.identity);
// 尝试在实例化的对象上找到MagicScript脚本
BaseMagic baseMagic = magic.GetComponent<BaseMagic>();
if (baseMagic != null)
{
}
PersistentMagic persistentMagic = magic.GetComponent<PersistentMagic>();
if (persistentMagic != null)
{
persistentMagic.SetAsChildAndReset(magic, gameObject);
}
// 计算从游戏物体指向鼠标位置的方向
Vector2 direction = (mouseWorldPosition - Caster.transform.position).normalized;
Debug.Log(direction);
// 设置魔法对象的朝向。这里假设魔法对象使用Transform.up作为其“前方”
magic.transform.right = direction;
}
}
玩家释放技能功能如图5.3 所示。
图5.3 玩家释放技能
5.1.4 玩家移动功能模块实现
玩家输入有关方向的按键例如AD,此时主角会随着按键的方向进行左右移动,同时碰撞检测持续检测是否触碰到地面,若接触,玩家按下空格键则主角可以进行跳跃行为,即施加一个向上的力。玩家移动功能模块实现相关 C#代码 如下图所示。
private void Move()
{
// 检测是否接触地面
isGrounded = Physics2D.OverlapCircle(groundCheck.position, 2f, groundLayer);
// 处理移动
float moveHorizontal = Input.GetAxis("Horizontal");
Vector2 movement = new Vector2(moveHorizontal, 0f);
rb2d.velocity = new Vector2(movement.x * moveSpeed, rb2d.velocity.y);
// 处理跳跃
if (Input.GetButtonDown("Jump"))
{
rb2d.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
}
}
玩家移动功能如图5.4 所示。
图5.4 玩家移动
5.1.5 玩家释放跟踪飞弹模块实现
当玩家释放飞弹,会搜寻最近的敌人,并且根据敌人、自身、偏移三个点的位置作为贝塞尔曲线参数,飞弹在前两秒以贝塞尔曲线的轨迹移动,两秒过后,飞弹会以直接跟踪模式对敌人进行追击,直到碰到敌人或者生命时间结束后销毁若敌人消失,则会更新跟踪目标,飞弹跟踪功能C#代码如下图所示。
private void Update()
{
if (target == null)
{
Destroy(gameObject);
//target = FindNearestEnemyInRadius().transform;
time = 6;
}
else
{
endPoint = target.position;
}
time += Time.deltaTime;
if (time < 2)
{
t += Time.deltaTime * speed;
// 计算贝塞尔曲线上的点
Vector3 position = BezierCurve(startPoint, controlPoint, endPoint, t);
// 计算朝向向量
direction = position - transform.position;
// 调整飞弹的朝向
transform.rotation = Quaternion.LookRotation(Vector3.forward, direction);
// 更新飞弹位置
transform.position = position;
}
else
{
if (sum == 0) {
trackingSpeed = direction.magnitude / Time.deltaTime;
rotationSpeed = trackingSpeed * 5;
sum++;
}
if (trackingSpeed < bulletSpeed * 0.4f) { trackingSpeed = bulletSpeed * 0.5f; }
trackingSpeed += 2 * Time.deltaTime;
rotationSpeed += 60 * Time.deltaTime;
if (time > 10)
{
Destroy(gameObject);
return;
}
if (target == null) {
//Destroy(gameObject);
GameObject nearestEnemy = FindNearestEnemyInRadius();
if (nearestEnemy != null){ target = nearestEnemy.transform; }
}
Vector3 directionF = endPoint - transform.position;
directionF.Normalize();
// 平滑旋转面向目标
Quaternion targetRotation = Quaternion.LookRotation(Vector3.forward, directionF);
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
// 向前移动
transform.Translate(Vector3.up * trackingSpeed * Time.deltaTime);
}
}
玩家释放贝塞尔跟踪飞弹模块如图5.5 所示。
图5.5 玩家释放贝塞尔跟踪飞弹
5.2 敌人模块实现
5.2.1 敌人受击模块实现
敌人与标签为"bullet"的对象碰撞后减少生命值,同时修改自己以及其子物体对象的颜色为红色,短时间后恢复为初始颜色,若生命值减少到0及以下则变小并且销毁自己。敌人受击模块实现相关 C#代码 如下图所示。
private void OnTriggerEnter2D(Collider2D other)
{
// 如果敌人与标签为"bullet"的对象碰撞,则减少Health值
if (other.CompareTag("PlayerHert"))
{
health -= (int)hurt;
// 如果Health减少到0或以下,则销毁敌人
if (health <= 0)
{
if (colliderComponent != null)
{
colliderComponent.enabled = false;
}
StartCoroutine(ScaleEnemy(enemy, originalScale));
}
else
{
if (colorRestoreInProgress)
{
return;
}
// 修改子物体的颜色
childRenderers.Clear();
GetComponentsInChildren<Renderer>(childRenderers);
ChangeChildColors(childRenderers.ToArray());
// 启动颜色恢复协程
StartCoroutine(RestoreColorsAfterDelay(childRenderers.ToArray()));
}
}
}
private void ChangeChildColors(Renderer[] renderers)
{
// 修改子物体的颜色并保存原始颜色
foreach (Renderer childRenderer in renderers)
{
originalColors[childRenderer.gameObject] = childRenderer.material.color;
childRenderer.material.color = targetColor;
}
}
private IEnumerator RestoreColorsAfterDelay(Renderer[] renderers)
{
colorRestoreInProgress = true; // 标记颜色恢复正在进行中
yield return new WaitForSeconds(0.1f);
// 恢复子物体的原始颜色
foreach (Renderer childRenderer in renderers)
{
childRenderer.material.color = originalColors[childRenderer.gameObject];
}
colorRestoreInProgress = false; // 标记颜色恢复完成
}
private IEnumerator ScaleEnemy(GameObject enemy, Vector3 originalScale)
{
while (enemy.transform.localScale.y > 0.001f)
{
Vector3 newScale = enemy.transform.localScale - new Vector3(5f, 5f, 0f) * Time.deltaTime;
newScale.y = Mathf.Clamp(newScale.y, 0f, originalScale.y);
newScale.x = Mathf.Clamp(newScale.x, 0f, originalScale.x);
enemy.transform.localScale = newScale;
yield return null;
}
Destroy(enemy);
}
敌人受击功能模块如图5.6 所示。
图5.6 敌人受击
5.2.2 敌人移动模块实现
敌人会搜索范围内玩家的位置,并且朝着玩家移动, 敌人移动功能模块实现相关 C#代码如下图所示。
private void Start()
{
//设置敌人的属性
moveSpeed = enemyData.MoveSpeed;
health = enemyData.Health;
//查找标签为"weapon"的对象
weapon = GameObject.FindGameObjectWithTag("Player").transform;
originalScale = enemy.transform.localScale;
// 获取当前游戏对象上的 Collider 组件
colliderComponent = GetComponent<Collider>();
}
private void Update()
{
// 敌人朝着标签为"weapon"的对象移动
Vector3 direction = weapon.position - transform.position;
transform.Translate(direction.normalized * moveSpeed * Time.deltaTime);
if (collision.CompareTag("weapon"))
{
SetHurt();
}
}
敌人移动功能模块如图5.7 所示。
图5.7 敌人移动
5.3 系统开发难点
系统的一大难点是如何保证性能的前提下通过按键顺序去技能库里找到对应的技能
技能熟练度系统的数值平衡,以及和其他系统的交互的可玩性设计仍然需要不断的测试优化迭代。
第6章 系统测试
6.1 功能测试
6.1.1 玩家功能模块测试
读取按键功能测试用例如表6.1所示。
表6.1 读取按键功能测试用例
用例编号 | 用例描述 | 操作过程及数据 | 预期结果 | 实际结果 |
Player_01 | 读取按键输入的顺序并保存 | 玩家输入按键,系统会把按键顺序保存在一个临时的列表里 | 系统列表里实时显示输入的按键的顺序并体现在UI上 | 正确 |
Player _02 | 清除按键 | 玩家输入按键后连续三秒不再输入新的按键则清除按键 | 三秒后系统清空按键列表并体现在UI上 | 正确 |
Player _03 | 根据按键列表找到对应魔法索引 | 系统根据按键列表里的按键顺序来返回对应的魔法索引 | 系统返回对应的魔法索引并体现在UI上 | 正确 |
Player _04 | 根据按键列表没找到对应魔法索引 | 系统根据按键列表里的按键顺序未找到对应的魔法索引 | 系统提示未找到对应的魔法并体现在UI上 | 正确 |
Player _05 | 释放魔法 | 玩家瞄准并按下鼠标左键,系统根据魔法索引释放对应的魔法对象 | 对应的魔法会朝着玩家鼠标指向的方向释放 | 正确 |
Player _06 | 取消魔法 | 玩家按下鼠标右键,系统会初始化魔法索引和按键列表的内容 | 系统现实魔法索引和按键列表都为初始状态 | 正确 |
Player _07 | 玩家移动 | 玩家按下AD按键,主角随着AD按键左右移动 | 玩家正确的左右移动 | 正确 |
Player _08 | 玩家跳跃 | 玩家按下空格键后,主角进行跳跃 | 玩家正确的跳跃 | 正确 |
Player _09 | 飞弹前两秒沿着贝塞尔轨迹移动 | 玩家释放贝塞尔飞弹技能 | 飞弹按照预设的轨迹移动 | 正确 |
Player _10 | 飞弹追踪敌人 | 玩家释放贝塞尔飞弹技能 | 飞弹两秒后追踪敌人 | 正确 |
Player _11 | 飞弹更新敌人目标 | 玩家释放贝塞尔飞弹技能,并中途击败敌人 | 飞弹在目标敌人死亡后追踪新的敌人目标 | 正确 |
6.1.2 敌人模块测试
玩家移动功能测试用例如表6.2所示。
表6.2 玩家移动功能测试用例
用例编号 | 用例描述 | 操作过程及数据 | 预期结果 | 实际结果 |
Enemy_01 | 敌人移动 | 玩家进入敌人的追踪检测范围 | 敌人正确向着移动 | 正确 |
续表6.2 玩家移动功能测试用例
Enemy _02 | 敌人受击变色 | 玩家攻击敌人 | 敌人受击后会红色频闪 | 正确 |
Enemy _03 | 敌人受击生命值减少 | 玩家攻击敌人 | 敌人受击后血条减少 | 正确 |
Enemy _04 | 敌人死亡 | 玩家攻击敌人直到敌人血量为0 | 敌人死亡并消失 | 正确 |
6.2 测试结论
游戏测试是整个游戏项目中不可或缺的部分,良好的测试与改进能够保证游戏的稳定和玩家的游戏体验。通过测试可以发现游戏的功能性问题或者性能问题,并提前做出修复或者优化,这对游戏运行时的表现是至关重要的,任何的奇怪的错误或者卡顿都会打破沉浸感,从而破坏玩家的游戏体验。此阶段要做好的就是功能性测试,后续可能还需要玩家大量测试并统计相关数据来调整游戏的数值平衡性,虽然不影响游戏的完整性,但是平衡性是保证游戏性的一大基础,为了保证游戏的质量,平衡性也需要重视。
第7章 结 论
“魔介之石:先行者”技能熟练度游戏系统的设计与实现。使用了Unity游戏引擎来开发绝大部分功能,引擎里包含各种插件来方便完成一些游戏效果的实现,同时支持C#编程语言来编写脚本来实现相关功能。到目前为止两个核心系统已经实现,技能熟练度系统实现了,按键读取,根据按键列表返回魔法索引,释放魔法,随着技能等级提升减少按键数量。非完全击败的敌人掉落系统实现了,敌人部位死亡掉落,玩家自动收集掉落物等功能。魔法库实现了,贝塞尔飞弹,火焰魔法,能量弹等魔法效果。
在游戏设计阶段,思考传统的2D横板游戏的优势与缺陷,参考魔法的咏唱原理构思出了技能熟练度系统的基本概念,同时改进的大型敌人的掉落生成系统,采用MDA设计框架以及游戏体验心理学来对游戏的两个核心内容进行相关设计,最终设计出了技能熟练度系统和非完全击败的敌人掉落系统。在技能熟练度系统上,改变了传统的释放技能的方式,同时在玩家操作这个非传统维度上进行了游戏体验增长,在非完全击败的敌人掉落系统上,则是以此机制自适应平衡了水平不同玩家的游戏进度,从而保证不同玩家的心流状态。从代码编写角度上来看,技能熟练度系统的实现难度较大,要兼顾性能与功能,以及保证操作上的手感。还要考虑两个核心新系统与传统2d游戏的耦合部分。美术部分则是由《魔介之石》世界观框架决定的奇幻魔法风格,相关部分由外部素材导入,配合Unity相关插件来实现对应的美术效果。设计了主角业希、向导塔洛兹的美术形象,魔介石核心物件的建模,和各个地图场景的原画设计。
对比现有研究,本课题的独特性在于它对传统技能释放模式的革新,为玩家提供了更丰富的游戏体验。然而,深入分析玩家行为和游戏满意度,以及对技能熟练度系统进行更细致的评估,对于完善设计和提升游戏吸引力至关重要。
此项目还存在一些不完善的地方,例如美术部分没有达到世界观预期的效果,敌人的行为逻辑不够丰富,技能数量不够撑起整个技能库,技能玩家操作上的手感、打击感仍然需要进一步的优化,这些内容会在后续进一步的添加。
总结而言,本研究不仅在理论层面探讨了两大核心系统的设计,也在实践中验证了其可行性。尽管仍存在优化空间,但其对游戏设计的创新性和对玩家体验的提升作用不容忽视。随着游戏行业的发展,技能熟练度系统有望成为推动游戏设计创新的重要驱动力。
参考文献
[1] INTENTA. 中国游戏产业的统计、人口统计和趋势[J]. INTENTA, 2023.
[2] US-China Institute. 中国的游戏和电子竞技的胜利[J]. US-China Institute, 2023.
[3] TechCrunch. 中国游戏产业首次多年萎缩[J]. TechCrunch, 2023.
[4] Mordor Intelligence. 中国游戏市场动态[J]. Mordor Intelligence, 2023.
[5] Pandaily. 2021年中国游戏产业报告[J]. Pandaily, 2021.
[6] Republic World. 中国批准105款在线游戏[J]. Republic World, 2023.
[7] Allen M J, Brown S D. Evaluating Usability and User Experience of AR Applications in VR Simulation[J]. Frontiers in Psychology, 2023, 14: 1-22.
[8] Rovatsos M. The Ethics of AI in Games[J]. Artificial Intelligence Review, 2023, 51(1): 75-99.
[9] Schmidt R, Thompson K. Exploring the Trends of Educational Virtual Reality Games: A Systematic Review of Empirical Studies[J]. Smart Learning Environments, 2022, 9(1): 33-58.
[10] Green T A, Lee P M. Systematic Review and Meta-Analysis of Augmented Reality in Medicine, Retail, and Games[J]. Visual Computing for Industry, Biomedicine, and Art, 2021, 4(1): 21-34.