基于Unity3D的生存解谜游戏的设计与实现.docx
摘要 自我国进入二十世纪八十代以来,国民经济如日方升,人民的生活方式也焕然一新,渐渐地人们对娱乐的需求越来越大,娱乐的方式也变得越来越多样化。然而电子游戏作为年轻一代的主要娱乐方式,其地位在年轻一代的心中也愈发重要。很多人都会通过游戏的简单操作完成有趣的任务,获得放松与快乐;通过角色扮演,在虚拟世界中寻找游戏的快感。2020年各行各业都受到了一定程度的冲击,游戏行业的发展也将充满了新的机遇和挑战。本文主要阐述的是The twelfth door的详细开发过程,包括我的研究思路、该游戏的开发环境以和开发工具、游戏的需求分析、游戏素材的收集以及游戏功能的实现。The twelfth door是一款基于Unity3D游戏引擎的生存冒险解谜类游戏,玩家需要通过扮演冒险者的角色,通过信息和物品的收集,解决每一个房间里面的谜题,才能对应打开每一个房间的门,通过十二扇门即可获得胜利。该游戏主要考验了玩家的观察能力、解决谜题的能力、手动收集信息和物品的能力,更多地需要玩家自己去探索和研究。本项目主要涉及到了Unity中场景的搭建、UI界面的设计、动画的创建、player玩家的移动与摄像机的跟随、背包系统的设计与实现和Event System响应事件。利用Autodesk 3ds Max 2014和Maya 2014进行建模,Unity3D引擎进行游戏设计,C#脚本语言编写游戏代码。关键词: 电子游戏 角色扮演 Unity3D 解谜 Abstract Since our country entered the 1980s, the national economy has been rising rapidly, and the way people live has also been changed. people's demand for entertainment is increasing, and the ways of entertainment are becoming increasingly pluralism.However, as the main entertainment method of the younger generation, the status of electronic games are becoming more and more important in the younger generation's mind.Many people will complete the interesting tasks through the simple operation of the game to get relaxation and happiness; through role playing, look for the thrill of the game in the virtual world.In 2020, all trades and professions have been impacted to a certain degree, and the evolvement of the game industry will also full of new opportunities and challenges.This article mainly describes the detailed development process of The twelfth door, including my research ideas, the development environment and development tools of the game, the demand analysis of the game, the collection of the game materials and the implementation process of the game functions.The twelfth door is a survival and adventure puzzle game based on the Unity3D game engine. Players need to solve the puzzles in each room by playing the role of an adventurer and collecting information and items in order to open each room.Open all the doors and you can win this game.The game mainly tests the player's ability to observe, solve puzzles, and collect information and items manually. It requires more exploration and research by the player.This project mainly involves the construction of scenes in Unity, the design of UI interfaces, the creation of animations, the movement of player players and the follow-up of cameras, the design and implementation of backpack systems, and the Event System response events. Use Autodesk 3ds Max 2014 and Maya 2014 for modeling, Unity3D engine for game design, C # scripting language to write game code.Key words:Electronic Game Role-Playing Unity3d Puzzle solving目 录第一章 绪论11.1 课题研究的背景与意义11.2 国内外相关研究情况2第二章 相关技术介绍52.1 开发工具52.1.1 Unity3D游戏引擎简介52.1.2 3d Max简介52.2 开发语言62.2.1 C#语言简介62.3 游戏开发环境6第三章 游戏的需求分析73.1用户需求分析73.2功能需求分析73.3数据存储需求分析8第四章 游戏的整体设计94.1 游戏的主要架构设计94.2 游戏的剧情设计94.3 游戏关卡设计10第五章 游戏的详细设计与实现115.1游戏的场景搭建115.1.1开始场景UI设计115.1.2游戏场景搭建115.2物品道具的设计125.2.1物品道具动画设置125.2.2物品道具的生成145.3 角色的移动155.4摄像机跟随155.5背包系统的实现165.5.1 搭建背包的UI165.5.2 背包数据存储175.5.3 展示物品信息195.5.4 实现鼠标拖拽物品225.6线索提示235.6.1 直接线索235.6.2 游戏线索245.7响应事件255.8 数字密码锁的设置26第六章 游戏测试286.1游戏功能测试28第七章 总结与展望297.1总结297.2展望29致谢31参考文献325第一章 绪论1.1 课题研究的背景与意义当今社会,电子产品越来越得到普及,我们的网络环境也越来越得到普及和完善。自我国进入二十世纪八十年代以来,国家经济如日方升,国民除了满足自身的基本生活需求以外,也渐渐关注到精神层面上的需求。因此人们对于娱乐的需求也越来越大,娱乐的方式也变得越来越多样化。近年来,游戏产业的发展欣欣向荣和网络技术的日益进步,就是像是电子游戏的催化剂,极大地推动了电子游戏的发展。与此同时,由电子产品衍生而来的电子游戏迅速收到广大玩家的青睐,各种电子游戏如雨后春笋般涌现,电子游戏越来越成为人们日常生活中不可或缺的一部分。电子游戏其实是数字媒介的一种,同时也是现代普罗大众自我娱乐的一种方式。游戏里面的角色丰富多样,人物个性鲜明、富有情绪、血肉饱满,再配合上特定的故事或者历史背景,加上适当的背景音乐,让人仿佛置身其中。电子游戏改变了我们的生活方式、娱乐方式和交友方式。RPG游戏,也就是我们经常所说的角色扮演类游戏,需要玩家扮演游戏世界当中的主人公,通过角色扮演完成相关游戏情节,在游戏世界中获得快感。角色扮演类游戏不仅仅对玩家起到一定的减压效用,还可以训练玩家的抗压能力、生存能力、社交能力和信息搜索的能力。有的人认为游戏是另外一种人生,在开发者所构建的虚拟世界里,你可以透过角色扮演体验到在现实生活中体验不到的世界,做任何你想做的事情,从而得到满足。在适当的时候去玩上一把游戏,除了可以帮我们褪去工作的负担,还可以带给我们即时满足的快感。有的时候玩游戏不仅仅是在玩游戏,虚拟的游戏世界就像是一个巨大的社交平台。通过游戏,你可以获得较为真实的社交体验,可以认识到志同道合的游戏好友,收获满满的友谊。当然,因游戏之缘,收获爱情的人也比比皆是。电子游戏的受众相当广泛,它不仅面向年轻一代的玩家,就算是小孩或者老人也同样适用。游戏的意义在于娱乐,但并不局限于此。目前很多的游戏都被赋予了宣传和教育的重大意义,把游戏和教育知识有机地结合起来,那么我们就可以在游戏的同时学习到各个领域的其他知识。在娱乐中学习、在学习中娱乐也未尝不是一件好的事情。因此能够做到寓教于乐,也是游戏的一大意义。随着我国游戏产业的飞速发展以及游戏用户规模日益扩大,游戏产业及其衍生的相关行业都创造了巨大的商业价值,对我国的经济的发展起到了非常重要的推动作用。电子游戏在经济发展中创造巨大价值的同时,也作为社会文化的重要成分影响着人们价值观念的构建1。电子游戏越来越成为当代人的主要娱乐方式,在塑造社会文化方面也发挥着极其重要的作用。事实上,大众对待电子游戏的态度也是千人千面。无论如何,游戏产业也已经迅速地成长起来了,游戏也成为了当代中国人们生活当中不可或缺的一部分。曾经有国外研究者指出,游戏的最终目的是实现与现实世界的互动,也就是说一款游戏的设计应该基于现实的社会生活。未来,我们需要对游戏玩家的心理、游戏与教育知识的有机结合、游戏与现实生活的互动、游戏与社会文化的有机结合等等进行更加深入的研究,相信我国的游戏市场也会越来越好。本课题主要结合了RPG游戏和解谜类游戏的两大特点,让玩家既能体验到角色扮演的快感,也可以享受到解谜和探索的乐趣。1.2 国内外相关研究情况二十世纪四十年代,历史上出现了第一台电子计算机,为互联网时代的到来奠定了坚实的基础。1985年,诞生了世界上的第一款电子互动游戏,电子游戏也开始进入萌芽初期。二十世纪六十年代,计算机编程语言出现并开始逐步发展。科技发展日新月异,各个领域对计算机技术的需求也不断加大,计算机编程语言开始变得复杂化和多样化,大大推动了计算机编程语言的发展。编程语言的出现,大大减少了计算机编程的人力和物力,同时也促进了电子游戏的进一步发展。二十世纪七十年代初,游戏公司开始出现在大众的视线中,一马当先的就应当是Atari(雅达利)公司了。随后雅达利公司开发出一款可以通过游戏主机接入电视使用的游戏,使得游戏画面第一次在电视上面播放。玩家可以借助其他的辅助设备,可以控制人物在电视屏幕上的移动轨迹和操作,使得游戏的可玩性大大提高。不仅如此,Atari(雅达利)公司的业务范围开始涉及到游戏机的制造,并且取得了十分不错的成绩,促进了家用游戏机的发展。随后街机游戏开始兴起,Atari(雅达利)公司所生产的家用游戏机销量急剧上升,玩家可以足不出户就能玩到街机游戏,玩家人数也开始增多,电子游戏也越来越被大众所接受。九十年代初期,各种电子游戏如同雨后春笋般涌现,电子游戏行业发展得如火如荼,慢慢地电子游戏行业所带来的巨大商业价值也开始被更多的游戏开发商所看见。1889年,一家名为任天堂的娱乐公司在日本成立。这家公司成立之初主要负责骨牌扎花的生产,在二十世纪七十年代后期看到电子游戏行业的巨大前景后,开始投身电子游戏行业,主要游戏的开发和游戏机的制造。在之后的十年里,任天堂可谓是硕果累累,推出了许多款堪称经典的游戏,成为最具影响力的游戏平台生产商之一,Atari(雅达利)也逐渐渐渐走向衰落,慢慢退出电子游戏的历史舞台。1994年索尼推出了一款名为PlayStation(简称PS)的32位家用游戏机,这不仅仅撼动了由任天堂所主导的长达十年的电子游戏市场,也大大加快了由2D游戏向3D游戏迈进的全新篇章。随着科学技术的不断进步,个人电脑的性能进一步提升,大大促进了PC游戏的发展。PC游戏的出现对游戏机的改革也起到了十分重要的促进作用。进入二十一世纪,电子游戏行业百花齐放,微软也开始进入大众的视野,凭借着XBox成功打入游戏市场。随着PC游戏的快速发展,许多游戏厂商也看到了电子游戏更多的可能性,研发方向也开始转向多平台研发。2002年,一个名为Steam的游戏集合下载的平台诞生,电子游戏开始在其他平台得到发展。2008年,支持第三方开发的苹果App Store正式上线,为移动游戏的开发奠定了坚实的基础。随着智能手机的推广和普及,移动端游戏也迅猛发展起来。近年来,由于虚拟现实技术不断发展,随之出现了虚拟现实游戏(简称VR游戏),只要你打开游戏,连接虚拟现实设备,带上特定的游戏头盔,你就可以走进游戏的虚拟世界体验身临其境的感觉,使得玩家的代入感越来越强。虚拟现实技术的出现,使得游戏从平面真正走向立体,VR游戏的发展前景也是一片光明的。现如今,电子游戏行业的发展越来越好,游戏的画质和清晰度也在不断提升,游戏的玩法也更加丰富多彩也更加富有剧情,游戏的操作难度也越来越简单化。简而言之,电子游戏行业的发展也正稳步发展中。虽然中国的游戏产业起步相较于国外来说比较晚,但是国内其实不缺乏游戏公司,也不缺乏各种各样的电子游戏。手游和页游开发和制作周期相对较短,投资回报率相对较高,所以我国的电子游戏都是手游和页游居多。目前我国的单机游戏发展势头良好,但似乎这条道路上也充满了各种各样的机遇和挑战。从国内最近几年的主流游戏来看,大众普遍喜爱的还是手游居多,其中比较受欢迎的有王者荣耀、第五人格、阴阳师、和平精英等等。它们大多都有着精美的游戏场景、丰富的游戏特效、富有感染力的游戏情节和绝美的游戏体验。不管是游戏操作体验还是游戏画面都符合了现阶段广大玩家的娱乐需求。如今中国的游戏市场正百花齐放蓬勃发展,玩家对于国产游戏的接纳度也不断提高,已经有相当一部分玩家开始支持优秀的国产游戏。2019年中国游戏产业整体保持稳中向好、稳中有升的良好态势2。根据中国音数协游戏工委(GPC)在2019年12月发布的2019年中国游戏产业报告(2019 China Gaming Industry Report)显示,2019年中国的游戏市场实际销售收入为2308.8亿元,同比增长7.7%,游戏用户规模突破6.4亿人2。国内游戏市场将会越趋于稳定和成熟。第二章 相关技术介绍2.1 开发工具 2.1.1 Unity3D游戏引擎简介说到游戏开发工具,我们首先想到的就是Unity3D游戏引擎,它是众多游戏爱好者和开发者的天堂,它不仅为我们提供了游戏开发中所用到的最基本的功能,还支持各种各样的unity插件,利用这一款游戏开发工具可以使我们更快更好地完成我们的游戏项目设计。它是由Unity Technologies开发的一款具有可视化编辑、属性编辑器以及动态预览功能,以交互图形化为首要方式的综合型游戏开发工具,是一个全面整合的专业游戏引擎3。它可以让开发人员能够轻松创建诸如3D游戏、工业仿真、室内设计、虚拟教育、实时三维动画等类型的应用程序3。Unity3D不仅仅支持3D游戏的开发,对于2D游戏的开发亦同样适合。Unity3D游戏引擎的功能十分强大,支持多种资源格式的导入、支持创建多个基本游戏场景、有用于渲染的粒子系统、丰富的动画系统、物理系统、光照贴图系统以及自动寻路系统。Unity3D游戏引擎还支持三种脚本语言:JavaScript、C#和Boo,开发者可选择自己最为熟悉的一种脚本语言来进行代码的编写工作。另外,在Unity开发的游戏可以一键部署到多个平台当中,游戏的载体也变得越来越多样化。Unity 可将游戏发布至 Windows、Mac、iPhone、WebGL(需要 HTML5)、Windows phone 8 和 Android 平台,移动设备支持虚拟摇杆,大大提高了开发者的开发效率4。Unity3D的自由性大、功能性又好,目前是适用范围最广的游戏引擎,也渐渐成为世界范围内的主流游戏引擎。作为一款强大的游戏引擎,对于游戏开发来说,Unity3D肯定是笔者的首选。2.1.2 3d Max简介3d Max是一款用于三维立体模型创建的软件,其文件的导出格式(.fbx格式)在Unity3D游戏引擎中可以兼容并且使用。3d Max界面清新简洁、操作也相对简单,因此上手也相对容易。另外,它对于硬件系统的配置要求相对较低,大大节省了游戏的开发成本。3d Max拥有强大的角色建模功能以及动画制作的功能,是3D游戏角色建模的一大帮手。2.2 开发语言2.2.1 C#语言简介C#语言作为众多高级编程语言当中的一种,它是由C语言和C+语言衍生出来的3。它在继承C和C+强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)3。如今电子游戏行业发展得如火如荼,Unity3D游戏引擎也被越来越多地用于游戏的开发当中,而Unity3D游戏引擎目前只支持Java、C#和Boo三种脚本语言,C#语言也是被使用最多的游戏脚本语言。所以说,用C#语言来进行整个游戏的开发就再适合不过了。2.3 游戏开发环境电脑型号 DELL DESKTOP-5M7PV2K操作系统 Win10操作系统处理器 Intel(R)Core(TM)i5-6200U CPU2.30GHz 2.40GHz内存 8GB ( 金士顿 DDR3L 1600MHz ) 第三章 游戏的需求分析3.1用户需求分析2020年是多灾多难的一年,在乍暖还寒的二月,一场新冠病毒以迅雷不及掩耳之势在我国武汉爆发并迅速席卷全球。目前,该病毒是众多传染病之中危害最大的一种病毒,它的潜伏期时间长、传播途径广、传播能力强,一旦入侵人体都将有致命的危险。在疫情全面爆发之前,国家迅速做出决策,大到武汉封城,建设小汤山医院,小到小区的人流出入管控,我们每个人都不能置身事外。疫情期间,足不出户都在为国家做贡献,此时游戏就成为了人们消磨时间、自娱自乐的一大利器。本项目主要是一款3D的生存解谜类游戏,属于益智类的解谜闯关游戏。开门是玩家的主线任务,玩家通过角色扮演进入到游戏的世界中,利用场景给出的道具获取线索,通过思考和推敲解决设置在每个关卡中的小谜题,即可完成一个开门任务。通过游戏不仅仅可以让玩家得到娱乐和放松,还可以提高玩家分析问题的能力和逻辑思维能力。3.2功能需求分析在本项目中将要实现的功能有UI界面的设计、玩家的寻路和移动、动画配置、背包系统和事件交互系统。UI界面设计:实现场景跳转、给出帮助信息和退出游戏三个功能玩家寻路和移动:通过寻路网格设置玩家可走区域,实现玩家移动动画配置:为主要的交互道具设置动画背包系统:帮助存储物品道具的基本信息事件交互系统:通过鼠标点击,完成人物与物品道具的交互图3.2 the twelfth door功能图3.3数据存储需求分析在本项目中的数据存储方式主要用到了二进制序列化存储和ScriptableObject类存储两种。其中二进制序列化存储用于一般的物品数据存储,先把需要用到的数据存储到一个类里面,经过封装后,通过外部的方法进行读取和保存。而ScriptableObject类主要用在背包系统的物品数据存储,它是Unity自带的一个类,是一个可存储数据的脚本化对象,是可序列化的。当我们重新运行场景时,可保留这个类里面的数据。图3.2 The twelfth door E-R图第四章 游戏的整体设计4.1 游戏的主要架构设计本项目主要设计了两个场景,分别是开始场景和游戏场景。在开始场景中主要设置了三个Button按钮,分别是Start开始游戏的按钮、Exit退出游戏的按钮和Help帮助按钮。当玩家点击Start按钮时,就会进入切换场景,进入游戏场景。当玩家点击Exit按钮时,退出整个游戏。当玩家点击Help按钮,屏幕中会弹出带有帮助信息的面板,玩家可自行查看游戏玩法等详细信息,点击关闭按钮即可回到开始场景界面。图3.1 游戏整体结构图4.2 游戏的剧情设计在本游戏项目中,该游戏的名字叫“The twelfth door”,顾名思义也可以叫做第十二扇门。游戏的主人公被困在一个房间之中,然而眼前所见并非所有,解开一个房间的门,等待着他的将是下一扇门,当玩家解开所有的门的时候,才会发现这原来是一个巨大的迷宫,走出迷宫才能获得最后的胜利。玩家一开始出生在一个特定的房间里面,通过收集线索和细微的观察,找到属于打开这扇门的所有信息并触发开门的机关,方能走出这个房间进入下一扇门的空间。在游戏场景中我们设置了很多小的物品道具,每一个物品道具都将是解开门的关键信息。4.3 游戏关卡设计在本游戏项目中,只有一个大的游戏场景,并没有明确的关卡切换,只是通过打开游戏场景中的门进入下一个空间,而这个空间也还是在同一个场景中,所以玩家就只能在一个场景中进行活动。玩家开始游戏时,只能在一个房间中活动,但随着玩家解开的门越来越多,活动范围也越来越广阔。游戏规定时长:五分钟游戏规则:玩家通过WSAD或方向键进行移动,鼠标滑动控制摄像机视角,鼠标点击拾取物品并放入背包系统。玩家在五分钟之内,找齐线索解决谜题,打开所有的门并走出迷宫即可获得游戏胜利。若是五分钟倒计时结束,玩家没有打开所有的门或者没有走出迷宫,游戏失败。游戏道具:门、神秘的挂画、火柴、毛巾、精灵之家、宝箱、简笔地图关卡设计(以前面两个关卡举例说明):第一扇门:门的提示信息为隐藏的五角星。利用毛巾擦拭墙上神秘的挂画,找出隐藏的五角星。所用道具:毛巾、神秘的挂画、火柴第二扇门:门的提示信息为精灵之家。打开宝箱,找到6个精灵进入精灵之家,完成精灵之间的对消游戏。所用道具:宝箱、精灵之家第五章 游戏的详细设计与实现5.1游戏的场景搭建5.1.1开始场景UI设计在开始场景中,我们简单设计了一个UI界面。首先在场景中添加Canvas画布,创建背景面板,分别添加Start开始按钮、Exit退出按钮和Help帮助按钮。当玩家点击Start按钮时,跳转到游戏的主要场景中,开始进行游戏;当玩家点击Exit按钮时,退出游戏;当玩家点击Help按钮时,弹出帮助提示信息面板,玩家可查看帮助提示信息,更好地参与游戏。图5.1.1-1 开始场景图5.1.1-2 帮助信息面板5.1.2游戏场景搭建本项目的场景大部分都是利用Unity自带的Cube搭建完成,以Plane作为地板、Cube作为墙面搭建迷宫。在这个大的场景中,我设计了十二扇门(即十二个关卡),利用墙面和门形成了一个个密闭的空间,在空间内部适当添加一些物体便于玩家快速解谜打开十二扇门。图5.1.2 游戏场景图5.2物品道具的设计5.2.1物品道具动画设置在本项目中,我们为物品设置了动画系统,下面主要以门的动画和宝箱的动画来举例。开门的动画:首先创建一个空物体作为门的一个父物体,打开Animation动画面板,点击Add Propetry,选择Transform/Rotation,点击录制,使得门围绕父物体的Y轴旋转90度,最后去掉勾选Loop Time选项,使其不会重复播放动画,完成开门动画的创建。打开Animator面板,添加一个空的闲置状态,使其一开始就进入这个闲置状态,然后点击Parameters添加一个Trigger并且将其命名为push。在闲置状态(idle)中建立一个新的联系到开门状态(open),点击中间的小箭头,在Inspector面板的Conditions中把名为push的Trigger添加进来。实现效果:门一开始属于闲置状态,当玩家按下push键,开始播放open的开门动画,实现点击按钮播放动画的效果。图5.2.1 开门动画开宝箱的动画:首先从外部导入一个顶部能够分离的宝箱,打开打开Animation动画面板,点击Add Propetry,选择宝箱的顶部box_top并为其设置动画。点击红色小圆点开始录制,设置宝箱顶部先向z轴平移,然后围绕x轴旋转-40度,最后再向z轴移动一小段距离,点击停止按钮,完成打开宝箱动画的设置。最后去掉勾选Loop Time选项,使其不会重复播放动画。图5.2.1-2 开宝箱动画5.2.2物品道具的生成在本项目中,在每一个房间中都会随机出现一种帮助我们得出最后一个密码的道具,在这里我们采用Random.Range()方法在使其在一个固定的空间里随机生成物体。首先需要定义一个预制体,通过for循环实现需要生成物品的数量,利用Random.Range()方法在X为1到-10,Y为0,Z为-5到22的区域内随机生成物品道具。把CreatProp 脚本挂载到场景中的空物体上,并把需要生成的物品道具拖拽到prefab当中,运行场景得到该范围内随机生成的物品道具。主要代码如下: 图5.2.2 随机生成道具代码5.3 角色的移动Unity中常用的几种实现人物移动的方法主要有以下三种:第一,通过Transforn组件来控制角色的移动,Transforn组件主要提供了三个函数分别是position、rotation和scale,通过控制position的X、Y、Z的值可以模拟角色位置移动。通过控制rotation的X、Y、Z的值可以改变角色的旋转角度。第二,通过添加刚体组件移动,刚体组件通常带有物理特性,可以更好地模拟角色在力的作用移动。第三,通过添加角色控制器组件来实现人物移动。它可以很好地模拟人物的一些动作,比如上坡、跳跃等等。在本次游戏项目中,我们将使用第三种方法来实现角色的移动。首先,创建一个空物体,命名为Player。在player的子级添加一个capsule,并为其添加角色控制器组件,通过编写人物移动的脚本(PlayerControl),实现角色的移动。主要代码如下图所示:图5.3 角色移动代码5.4摄像机跟随在玩家移动的过程中,要求摄像机跟随玩家移动。我们可以把摄像机拉到player下面,让player作为它的父级,调整摄像机的位置始终在玩家的右后方,这样当玩家移动时,摄像机也会跟着玩家一起移动。在游戏中,玩家通常需要获得更加广阔的有游戏视角,为此可以通过移动鼠标改变摄像机的旋转角度来实现。首先需要通过Transform获取玩家,定义鼠标移动的值和鼠标的灵敏度,在Updata()方法中获取鼠标X轴和Y轴移动的值,当玩家旋转时摄像机也跟随玩家旋转。这里我们还用到了Mathf.Clamp()方法限制摄像机Y轴的旋转。主要代码如下图所示:图5.4 摄像机跟随代码5.5背包系统的实现背包系统是游戏中最常用到的系统之一,游戏背包可以增强游戏与玩家之间的互动。玩家可以通过游戏拾取道具放入背包系统中,打开背包系统,能够直观了解到自己在游戏过程中获得的物品道具。大概思路主要是通过玩家操控鼠标点击获得物品,物品会自动添加到我们的背包当中,背包方格的右下角中展示物品的持有数量,点击背包当中的物品,底栏显示该物品的详细信息。设置按下键盘O键打开或者关闭背包系统,通过鼠标拖拽可实现物品之间的位置交换。使用鼠标拖拽可以调整背包的位置。5.5.1 搭建背包的UI整个背包主要由背包的父级面板、标题、关闭按钮、格子和详细信息五个部分组成。首先创建一个panel面板并调整好适应屏幕的位置,为其添加背景图片,作为整个背包的父级。在父级下面设置一个Image改名为Title作为背包的标题。在父级面板的右上角添加一个关闭按钮,并为其设置点击事件,把整个父级面板拖拽过去,就可以实现点击关闭按钮关闭背包的功能。添加一个panel用于存放格子,并为其添加Grid Layout Group组件,通过调整第一个格子的大小和每个格子之间的空隙来规范每个单元格的大小。最后在父级面板的底栏增加一个text,用于存放物品的详细详情。图5.5.1-1 Grid Layout Group的设置图5.5.1-2 背包UI效果图5.5.2 背包数据存储ScriptableObject是Unity自带的一个类,继承于UnityEngine.Object,在本项目中我们利用它来实现背包系统数据的存储。创建一个新的类Item,用于存放物品的所有属性信息,例如物品的名字(itemName)、物品的图片(itemImage)、物品的数量(itemHeld)、物品的详细信息(itemInfo)。主要代码如下图所示:图5.5.2 Item类创建一个新的脚本Inventory,用List列表存储我所有的物品。大概思路是当游戏角色的鼠标点击到世界地图上面的物品之后,List列表中的物品增加一个,查看当前点击到的物品分别属于那个类,并把item获取进来。首先把物品放置在场景中,为该物品添加一个Box Collider组件并勾选Is Trigger,编写添加物品到背包中的代码。利用 OnMouseDown()方法判断鼠标是否点击了该物品,如果鼠标点击了该物品,则在List列表中存储该物品的相关信息。如果List列表中已经含有该物品信息,则在该物品原有数量的基础上增加一。最后把游戏世界当中的物品销毁,并把代码挂载到需要碰撞的物品上面。主要代码如下:图5.5.2-1 Inventory代码图5.5.2-2 点击添加物品代码5.5.3 展示物品信息创建一个新的脚本Slot,继承Item里面的属性,把脚本挂载到prefab上。在Slot方法中添加一个ItemOnClicked()方法,用于实现点击背包上面的物品弹出该物品的详细信息。主要代码如下:图5.5.3 Slot代码新建一个脚本Inventory Manager主要用于控制我们的背包并把脚本挂载到Canvas上。用List列表存放生成的格子,在UpdateItemInfo()方法中,更新物品的详细信息。用 RereshItem()方法获取到ItemLIst里面所有的信息,然后把这些信息传给Slot类,最后在prefab里面展示这些信息。主要代码如下:图5.5.3-1 Inventory Manager代码图5.5.3-2 Inventory Manager代码5.5.4 实现鼠标拖拽物品打开背包,可以通过鼠标拖拽移动背包中物品的位置,如果拖拽到的格子里面没有物品,则直接把物品存放在拖拽的格子中;如果拖拽的格子中已经有物品,则格子中的物品与鼠标拖拽的物品位置发生交换。新建一个新的C#脚本,使用UnityEngine.EventSystem事件管理库里面的三个方法,完成拖拽。首先使当前物品的位置等于鼠标点击的位置,使用SetParent()方法更改物品的父级,使其不会被其他的格子挡住。在拖拽过程中,我们需要判断物品重新放置的位置,这里我们会使用鼠标判断射线的方法来实现。假设我们通过点击鼠标拖拽物品时,我们的Main Camera会在按下鼠标的这个位置向屏幕的方向发射一条射线,在最上面的一层会被射线碰撞到,返回这个物品的一系列信息,比如说物品的名字、图片等等。在预制体slot中挂载一个Canvas Group组件,开始拖拽时需要设置Blocks Raycasts为false,这样就可以获得我们当前拖拽的物品信息。在拖拽过程中和结束拖拽时,需要设置设置Blocks Raycasts为true,获得拖拽后格子的物品信息,完成物品位置的交换。主要代码如下图所示:图5.5.4-1 鼠标拖拽物品图5.5.4-2 鼠标拖拽物品图5.5.4-3 鼠标拖拽物品5.6线索提示5.6.1 直接线索在本项目中是主要通过找出设置在每一个房间中的答案信息从而打开各个房间的门,所以线索提示就显得尤为重要。例如:在第一个房间中,玩家鼠标移动到门的位置,屏幕就会给出一条提示信息,提示第一个房间中的信息就是要找到隐藏的五角星;鼠标离开则提示信息自动消失。首先我们在Canvas画布中添加一个panel,在panel中添加一个text,把我们需要给出的提示信息记录在text中。这个时候我们需要用到的是UI事件当中的Pointer指针事件,当我们的鼠标指针与UI物体进行接触时,就会触发相应的指针事件。也就是说,当鼠标移动到该物体上,屏幕给出相应的提示信息;当鼠标离开该物体,屏幕上面的提示信息对应消失。主要代码如下:图5.6.1-1 鼠标指向给出提示信息图5.6.1-2 线索提示效果5.6.2 游戏线索在本游戏中除了鼠标检测到物体给出的直接线索外,还设计了游戏线索,即通过完成简单的游戏来获得线索。例如在第二个关卡中,我们设置了简单的对消游戏,玩家通过每次点击两张卡片,完成对消,获得开门的密码。若点击的两张图片相同,则显示成功的图片;若两张图片不相同,则返回可重新点击。图5.6.2 线索提示效果5.7响应事件Unity游戏引擎中提供了一套完整的事件响应系统,因此我们可以很好利用它来实现的我们所需要的功能。例如:在第一个房间中,玩家需要找到隐藏的五角星方能打开第一扇门。主要设计方案是当玩家找到隐藏的五角星(即点击五角星所在区域),第一个房间通关成功,第一扇门自动打开。首先我们要在场景中添加一个EventSystem,然后在挂载Main Camrea的player中添加一个Physics Raycaster组件,添加一个Cube将它设置为按钮并添加box collider碰撞组件,最后添加Event Trigger组件,把预制体Door1拖拽到Event Trigger组件当中,选择Animator.SetTrigger方法,实现点击button按钮打开门,并播放开门的动画。图5.7 Event Trigger的配置5.8 数字密码锁的设置在本游戏项目中,我