基于unity射击小游戏的二次开发
游戏原形分析
-
游戏的核心玩法
玩家通过W,A,S,D四个方向键操纵主角人物进行移动,按下J发射子弹,按下P暂停游戏,按回车键重新开始游戏。
游戏中怪物会自动生成,并向着主角方向移动,碰到主角时游戏失败;在主角发射的子弹碰撞到怪物,或者两个怪物互相碰撞时,怪物会被消灭。 -
场景构建
游戏利用了UNITY商店中可以下载到的场景素材、粒子系统特效动画(发射子弹时的游戏轨迹、怪物死亡特效、主角死亡特效)和人物模型素材进行设计,画面效果较为精美且对运行时计算机的配置要求不高;游戏的背景音乐及音效来自网络,与游戏画面较为契合,可以为玩家带来愉悦的游戏体验。
-
核心功能
PlayerController 控制角色行为
按J键角色开火攻击敌人,设定有射击时间CD firerate。如果按下J键的时间间隔超过CD时间,则可以开火攻击;未超过则无法攻击。
按下W键前进,S键后退,A左转,D右转,移动距离为按下时间乘设定速度。
子弹(Bolt)
由于子弹是根据玩家的发射行为而生成的,此处用到了预置件功能。
怪物(Monster)
由于怪物并不是随着游戏开始就出现的,需要随着时间推移而逐个生成,此处用到了预置件功能。
在场景上生成并初始化怪物,逻辑与子弹发射基本相同。
GameController 游戏主体逻辑控制
按P暂停和继续:
为了使游戏只在主角未死亡时才能暂停和继续,设定一个变量命名为pause。只有在dead == false的情况下,如果按下P,且pause == false,则给pause赋值true,暂停游戏。如果pause == true时按下P,给pause赋值为false,继续游戏。
主角死亡状态:
之前的碰撞判定中规定:如果怪物与主角发生碰撞,将给GameController脚本中的dead赋值为True。在GameController里,若dead == true,关闭操控主角的功能。在死亡状态下,按下回车可以重新开始游戏,即在dead == true状态下,按下回车重新载入场景。
在死亡的时候需要给摄像头弹出提示文字。给main camera关联的text.cs文件中创建如下函数即可:
问题分析
游戏本体已实现基本的角色行动、怪物生成、得分逻辑等功能、但仍存在些许不足,例如:缺少基本的边界逻辑,角色及怪物容易抛出场地,导致游戏无法进行;缺少碰撞判定,生成过多的模型会使游戏占用过多内存,同时穿模问题会使游戏趣味性下降。此次二次开发,主要解决这两个问题。
问题解决
Destroybybolt 碰撞判定
每一帧进入碰撞体积的物体都会予以判定,这个脚本用在怪物上。给各个物体添加过标签(tag),包括player、monster、bolt,在判定函数中即可代表怪物与其他的哪种物体碰撞了。
如果进入碰撞体积的是玩家,即代表怪物与主角碰撞,此时关闭人物控制使能,将dead状态设为true,并使两者消失;如果进入碰撞体积的是子弹或另一个怪物,使两者消失;当进入碰撞体积的物体是边界、地面、和MonsterCave时,我们不希望这些物体被销毁,所以什么也不发生,就是直接return。
这里需要给人物添加一个表示死亡状态的变量dead。
边界逻辑:
为了防止发射出的子弹没有判定碰撞时占用过多内存,添加一个边界逻辑。OnTriggerExit函数对每一帧每一个离开该脚本所在的物体的碰撞器的其他物体进行判定,若除了主角以外的物体离开边界,就使其消失。
总结
通过对这款小游戏的二次开发,我不仅提高了自己的技术水平,还深刻体会到一款优秀的软件应当能通过不断地开发迭代,以满足用户或业务的不同需求,优化系统性能、提高软件灵活性和可拓展性。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)