本期教程,我们要学习如何将外部资源加载到游戏中,比如图片、模型或UGY文件等。我们将使用Unity引擎,我已经安装了2020.3.0F1C1版本的Unity。
首先,我们需要创建一个新项目。我选择了2D模板,因为我们的游戏是2D的。不同的模板可能会有一些预设不同,但对游戏影响不大。创建项目可能需要一些时间,我们可以进行其他操作。
接下来,我们需要添加一些引用。在Unity中,我们使用Asset Bundle模块来加载AB包。如果只需要加载图片,其实可以不使用AB包,直接加载图片并生成Sprite。但对于模型等资源,最好还是使用AB包。
创建项目可能会有点慢,在等待时,我们可以进行其他操作。我们先制作一个简单的UI界面,比如一个画布和一些控件,如文本和按钮。Unity提供了很多UI控件,我们可以根据需要选择。
现在,我们已经创建了一个空项目。我们先制作一个简单的UI,比如一个画布。然后,我们可以添加一些控件,比如文本和图片按钮。在这里,我们可以使用TextMeshPro组件,它提供了更好的文本显示效果。
这个TextMeshPro可以实现一些比较漂亮的效果,但一般情况下都是很需要的。它提供了单选按钮、选项滑动条、下拉选单、输入框等控件。我们可以创建一个自定义UI,比如叫做"Mod窗口",使用TextMeshPro作为背景框,并将其锚点设置在中下方,文字居中显示。
这里我做了一些简单的演示,比如创建了一个按钮,大小为8×1,以便清晰显示。我展示了一个按钮和一个滑动条,还更改了它们的名称。然后我创建了一个文本框来显示滑动条的数值,初始值设为零。
现在我们想将这个UI放到游戏中,首先我们需要将它制作成一个预制体。然后在Assets包中新建一个文件夹,比如"Hello Mod",注意文件夹名只能使用小写英文字符。
接下来,我们需要创建一个脚本来进行打包操作。在脚本中使用Unity Editor的命名空间,并创建一个按钮来调用打包操作。然后我们就可以在Unity界面上看到一个名为"TOOS打包"的按钮了。
现在我们按下这个打包按钮,就会调用这个方法,我们可以在其中编写打包操作。首先,我们定义一个变量来表示我们要放置ab包的文件夹,比如我要将其放在名为"ab"的文件夹中。然后,我们检查该文件夹是否存在,如果不存在,则创建它。
接下来,我们使用BuildPipeline中的AssetBundleManifest模块,选择我们之前写的文件夹作为输出目录,并设置打包选项。打包选项包括压缩方式等,你可以根据需要进行设置。然后,选择输出的平台,根据游戏需要选择适当的平台,比如Windows64位。
如果出现编译错误,可能是因为我们的脚本是一个编辑器脚本,所以我们需要将其放在Editor文件夹下。重新运行一下操作,然后在项目文件夹中查看是否生成了ab文件夹,里面包含了我们打包好的文件。
接下来,我们要加载这个文件。文件的加载方式有多种,比如使用IO命名空间的文件加载方法。但是,我们更倾向于将这个ab包与我们的DLL一起发布,而不是作为单独的两个文件。但如果你的mod和资源是分开的,你也可以使用文件加载方式。你可以复制ab包到游戏目录,并使用路径来加载资源。
最后,我们可以通过实例化预制体来加载UI。我们将预制体的名字设置为"HelloModCanvas",然后将其实例化出来。现在我们启动游戏,按下快捷键,就可以看到我们的UI已经加载出来了。
现在我们已经有了这个UI,但它上面还没有任何方法。我想说的是,最好不要在Unity里面写这些方法,最好是在mod里面写好之后,在加载出来后进行方法的绑定。
为什么呢?因为如果你在Unity里面写这些方法,你还需要单独生成一个DLL,然后将其与mod一起发布。这样就会变成两个问题。其实这样并不太方便,因为一般情况下最好的做法是mod只有一个DLL,文件太多会让玩家感到困扰,可能会造成混淆。
我来举个例子,比如我们想要在按钮点击事件上输出一个"Hello world"。我会单独写一个方法来实现。现在我们取消UI的KMS,获取到我们想要的按钮。我们可以像这样找到相应的按钮,然后获取它的transform属性。
接下来,我们给按钮绑定一个方法,当点击按钮时输出"Hello world"。我们可以使用Lambda表达式,当然,如果你不了解Lambda表达式,你可以去学习一下。当然,除了Lambda表达式之外,你也可以不用命名函数,直接传入一个函数也可以。
但是,我更推荐使用上面的方式,因为这样方便你查错。然后我们再来绑定一下滑动条。同样的方式,找到滑动条,然后给它绑定一个方法,当值改变时输出一个参数,然后让后面的数字跟着滑动条的值改变。最后,我们再绑定一下触发器,让它在点击时显示隐藏滑动条。这样我们就完成了绑定。
当然,实际上,一个一个获取控件是有点麻烦的,但是如果你要处理的控件很多,你可以自己写一些前置的方法来简化它。这个部分就需要你们自己去扩展这个想法了。我这里演示的是最基本的操作。
游戏重启一下,然后开发一下,关键出来了。点击按钮后,可以看到"Hello Word1"的输出,这样UI的加载基本完成了。
现在让我说一下其他的加载方式。因为我们现在是从文件加载的,但是很多时候我们不希望UI分开发布,我们希望玩家只拿到一个DLL。那怎么办呢?我们可以将UI文件直接拖动到我们的mod项目里面,然后选择嵌入的资源,将其视为一个嵌入的资源。然后我们就不使用文件加载,而是使用流加载。这种加载方式比较常用,其他加载方式你们可以自行查阅。
另外,关于图片的加载,如果你只是加载一张图片,没有必要打包这么麻烦。你可以直接在Unity里面创建一个Texture2D,然后让它加载数据,最后生成一个Sprite来显示。当然,如果你不想用这种方式,也可以直接将图片拖拽进来,然后打包,就可以直接使用了。
最后,如果你已经打包了图片,要加载这张图,只需要在代码中指定文件名即可。这里需要注意的是,文件名不需要后缀名,Unity会自己寻找。本期教程到这也说得差不多了。