Advertisement

Unity 3D官方教程——Quiz Game学习记录

阅读量:

Unity下Learn Scripting中的一个游戏教程学习。

------------------------------------------

1.准备工作

新建一个2D项目,命名为Quiz Game。

在Assets库中创建三个新的文件夹:Prefabs、Scenes以及Scripts文件夹。移除场景中的主相机,并使用快捷键Ctrl+S将该场景保存至Scenes文件夹中,并将其命名为Persistent

打开文件启动一个新的场景,并以MenuScreen命名后存放在 Scenes 文件夹中。
随后,请您继续创建新的游戏场景,并将其命名为 Game 后存放在当前文件夹中。

将Persistent场景中的空对象命名为DataController,并创建新对象。在Scripts文件夹中新增两个C#程序文件,并将其命名为DataController和AnswerData。将该方案的数据控制器绑定到同名对象上。

2.创建数据类

打开AnswerData脚本并编辑

新建QuestionData C#脚本并编辑

新建RoundData C#脚本并编辑

打开DataController脚本并编辑

请执行以下操作:首先打开Build Settings界面,在其中将三个关键场景按照图示指定的顺序进行配置并保存设置后退出该界面。这一操作的主要目的是确保所有指定场景能够顺利加载并正确运行。

然后将MenuScreen的Main Camera背景配置为黑色。在Persistent场景中运行测试用例后发现:该脚本成功加载了MenuScreen场景,并将对象DataController设置为不被摧毁。

3.设置游戏开始界面

在对象DataController的Inspector上编辑

创建一个新的Button,并将其命名为StartButton;然后将该按钮的text属性设置为'Start'。同时,在Position和Pivot属性上进行设置,使其位置和旋转对齐居中。

Canvas下新增Text并命名为TilteText,在内容中设置为Quiz Game,并将字号设为40进行居中显示,并放置于适当位置。

新建空对象命名为MenuScreenController,新建同名脚本并拖入。

编辑脚本

然后将MenuScreenController拖拽至StartButton,并选择StartGame Function

4.游戏场景设置

在Game场景中切换至主界面并创建新的QuesitonPanel元素,默认设置其显示状态为空白,并将背景颜色设置为绿色;随后在该Panel内部新增一个名为QuestionDisplay的Text元素,并将其内容重新定义为空白文本;接着将文字元素的字号设定为32号,并设置其字体颜色为空白;最后将光标定位到Middle Stretch位置(仅按下Alt键进行定位),并适当放大文字大小;同时对Top和Bottom缩放比例均设置回默认值0,并调节整体尺寸至适中状态

Answer区域新增一个名为AnswerPanelUIElement并将原有的(Image)组件进行删除操作;随后调节其尺寸使其与主文本区域(QuestionText)实现对齐效果;在此基础上插入一个垂直布局组(VerticalLayoutGroup)以便后续生成的答案按钮能够被准确排列;特别提醒:在设置相关属性时请确保勾选ChildControlSize设置中的WideAndHeight选项

在AnswerPanel中新增一个Button,并将其命名为'AnswerButton';在该Button下方设置锚点居中显示Alt提示信息,并在其Text字段中设置字号为20

在Canvas中创建一个Panel组件,并将其Image子组件移除后重新调整尺寸至与Question text对齐的位置。随后,在此Panel区域新增一个Text组件,并将其命名为TimeDisplay。将字体字号设置为20号字,并将字体颜色设置为白色。接着使用Alt键将字体位置设置在右上角位置处,并将显示内容更改为‘Time : 0’。随后将该Text组件复制并命名为ScoreDisplay,并修改其显示内容至‘Score : 0’。最后将拷贝的文本放置于Time显示文本下方的位置处完成操作

删除已复制的AnswerPanel后不再保留复制的QuestionPanel,并设置背景颜色为紫色。将Text字段的内容设置为ROUND OVER并将UI拖动至屏幕最底端以使其位于其他组件之上。随后将按钮命名为MenuButton并将其内容设置为Menu。最后移除AnswerPanel旁边的显示标记并将其拖动至屏幕最底端以使其位于其他组件之上。

在层级结构中新增两个空对象,并分别为其命名为GameController和AnswerButtonObjectPool。

5.答案按钮的设置

创建空对象,并命名为AnswerButtonObjectPool;同时创建C#脚本SimpleObjectPool,并将其导入。该对象旨在将所有具有不同内容的AnswerButton组件整合到一个ObjectPool中,并用于后续操作。

在AnswerButton上新建C#命名为AnswerButton,打开并编辑

接着将AnswerButton按钮导入到Prefabs中作为预制件,并将其从Hierarchy中删除。接着将该预制件导入到AnswerButtonObjectPool中的代码组件中。

6.游戏流程控制GameController

GameController下添加同名C#脚本,打开并编辑

回到Unity,把所需选项拖到面板里

在保存并执行测试操作后,我们发现系统仅成功加载至菜单场景(MenuScene),而游戏场景(GameScene)未能顺利加载。通过Console日志分析得知:系统日志显示...[此处插入具体日志内容]...其中出现"NullReferenceException: Object reference not set to an instance of an object"错误提示:经过排查发现问题出在数据控制器的加载方式上。原因是游戏控制器在引用数据控制器时采用了错误的方式。

查询API得知

将实例化操作嵌入到start()方法中进行处理;然而,在我的实现中则是通过一个独立的机制完成对另一个对象的引用;值得注意的是,在这两个对象中都需要执行相应的初始化操作;因此,在使用A对象来访问B对象时(即A::call(B)),由于B对象可能尚未完成初始化(即尚未进行实例化),从而导致其内部状态信息无法正确获取到;最终的结果便是返回空值。

故参考2D Roguelike游戏控制器设为单例的方式把代码改为

保存后再次播放测试,可顺利到达以下界面

7.使AnswerButton点击有效

在AnswerButton预制件中新建On Click事件时,请将上方具有相同名称的脚本拖入此处,并设置HandleClick事件。

然后播放测试,出现和GameController一样的问题:没有引用。

更改脚本

8.结束该轮并重新开始游戏

为Game场景中的MenuButton组件新增一个点击事件处理逻辑,并将一个来自Hierarchy库中的GameObject实例拖入该区域,随后选择其中的ReturnToMenu方法。保存此设置后,在下次访问该菜单时即可恢复游戏状态。

9.用PlayerPrefs记录游戏最高分记录

新建C#脚本命名为PlayerProgress并编辑

在游戏场景中,在RoundPanel窗口内新增一个Text控件,并将其名称设置为HighestScoreDisplay,并使其显示的内容进行相应的修改

打开DataController脚本并新增

打开GameController脚本并新增

保存后返回Unity并把HighScoreDisplay拖入

保存返回初始场景测试,最高分正常保存显示。

10.通过JSON加载游戏数据

在 Assets 文件夹中创建一个子目录 StreamingAssets,请确保该子目录名称严格遵循大小写规则,并且绝对不能有任何错误(case-sensitive)。无论工程包如何移动或重组(例如打包后的版本),该子目录内的数据都不会受到影响。接下来,请创建一个新的文本框命名为 data.json,并请更改其扩展名以避免与现有命名冲突;然后将其保存至 StreamingAssets 文件夹内,并打开并编辑它。

上图是我为了阅读清晰加了缩进,实际上的文本是一行从头写到尾:

新建C#脚本GameData,打开并编辑

上图是错误的,如果使用

该错误表明系统在尝试解析JSON数据时遇到了困难:无法将JSON数据解码为GameObject实例

意思是不支持反序列化生成一个MonoBehaviour的子类。

正确的是:

然后打开DataController脚本并新增

保存后回到Unity测试,发现可正常读取JSON并运行。

另:

遇到这种情况时(StreamingAssets),通常会遇到在PC上看似正常运行但打包后却无法读取文件的问题。这种问题的原因在于,在Build完成后对JSON进行了封装处理(见链接中的作者解答)。

http://sammaru.blogspot.com/2017/03/unity-jsonutility.html

关于Unity内文件读取各路径及特点见下面链接:

http://topdevil.com/unity_path_ios_android/

创建一个能够编辑游戏数据的界面,并包含将游戏数据保存为JSON格式的功能;此外该界面还支持从JSON文件中导入并转换相关游戏数据。

在Scripts文件夹中创建一个名为Editor的新文件夹,在Editor文件夹中创建一个名为C#GameDataEditor的新文件夹,并将其打开以便进行编辑。

保存后回到Unity打开Window→GameDataEditor可看到

在该界面内可以直接修改数据点,在这里点击Save data即可将新数据以JSON格式存储,并覆盖原有内容

完毕。

全部评论 (0)

还没有任何评论哟~