原作者:裙子 / 2020年3月7日 再版:夜谷紫幽
等等,这就做出了一把剑?我还没开始写代码呢??咳,当然没有这么便宜的事,因为这些代码都是别人给你写好的,接下来我们就要康康这把剑是如何实现的。
打开源码文件
首先我们打开TemplateMod2的源码,双击csproj或者sln文件打开Visual Studio工程。相比于第一版教程,第二版的TML0.11是不用手动加入引用的,TML已经帮你自动安排好了。
注意,一定要打开csproj或者sln文件才会有VS的代码补全效果
不出意外的话,在右边的解决方案资源管理器里应该能看到类似这样的界面
可能有些文件我这里有但是你们那里没有,不过不用担心,我们的目标是SkirtSword.cs文件,点击它就会出现代码界面。
首先我们要明确一点,如果没有特殊设置,图片名字应该和类名完全一样并且在同一目录下,这样TML内部才能通过类名找到这个物品所对应的图片资源。
基础语法
注释
如果点开后我们被这一大堆代码吓到了,不要着急,因为里面很多行代码其实是注释。注释的意思就是这一行不是给机器看的,而是给人看的。我们可以用//
或者/* 注释内容 */
这样的语法写注释,比如
我们这段绿色的字就是注释。那么既然游戏不会执行注释的代码,那么它是干什么的呢?当然是写给你看的啊,注释也是教程的一部分呢。
当然,除此之外,注释还有很多其他的作用,比如如果你想不起来这个函数是干什么用的,那么给它一个注释会方便你以后记起来它的作用。总而言之,不是写给你看,就是写给别人看的,反正不是写给电脑看的。
命名空间
接下来我们观察一下这一行namespace TemplateMod2.Items {
namespace
是命名空间的意思,在C#里,它的作用就像是文件路径,可能你有很多个相同名字的文件,但是他们不在同一个路径下,就是不同的文件。那么这段代码的意思就是这个类在TemplateMod2.Items
这个路径下,而我们也正好把SkirtSword.cs这个文件放在了TemplateMod2\Items
路径下。
TML内部在找到这个类的时候,会通过它的命名空间来寻找图片文件的位置,比如如果这个类的命名空间是TemplateMod2.Items
,那么TML就会去TemplateMod2\Items
路径下去找。
所以我在这里提醒一下你们,一定要检查图片所在路径是否和命名空间是一致的。
类名
再往下看,就是类名了
我之前说的类名类名,其实就是这个东西。
引号前面的SkirtSword就是这把剑作为物品的类名,它在这个Mod的所有物品中一定要是唯一的。
但是如果这个东西不是物品,却可以重名,如果命名空间不同的话(想一想,为什么?
引号后面的东西是继承的类,也就是标记了这个类是物品、弹幕还是NPC等等的一个说明,暂时先这么理解,我们以后会讲到。
函数
接下来我们介绍函数,往下看这一大段都是一个函数
这个函数的名字叫SetStaticDefaults
,里面的代码主要作用就是设置物品名字,描述这些。要注意的是,符合这个函数功能的代码才能写进这个函数里面,如果写错了函数,那么可能就看不到想要的效果了。
缩进
你可能注意到了,这些代码是按照一定的格式写出来的
每个大括号包围的块都比大括号要往前4个空格的距离(VS里按Tab键缩进),如果不按照这个格式写,代码能运行嘛?当然能,但是千万不要这么做
之所以有缩进,就是为了能让你看清楚这一段代码是属于哪个块的,比如namespace TemplateMod2.Items
所包含的代码块就代表属于这个TemplateMod2.Items
命名空间下的代码
namespace TemplateMod2.Items { class SkirtSword// 属于命名空间这块的代码 { public void function()// 属于class(类)的代码 { // 属于function(函数)的代码 } } }
代码缩进非常重要,这不是可选的,而是我希望每个Mod制作者都遵守。VS也有提供格式化代码的方案,详情可以百度。
如果你想深入研究Mod的话,一个良好的语法基础是必不可少的,此处推荐阅读C#菜鸟教程
属性修改
现在,你已经具备了写Mod的基本知识了,现在你最关心的是如何修改剑的属性了吧,那么往下看到SetDefaults
这个函数。它的作用就是设置物品的基础属性,现在,你可以根据这个文件的注释去修改这把剑,看看效果如何。修改完毕后,只要在TML界面编译并加载就可以看到效果
除此之外,VS同样可以生成Mod并且一键启动Terraria,更加方便快捷(并且很好解决了我忘记保存的问题)
若是要发布Mod或者发送.tmod文件,记得要先 生成-生成Mod
在这个空心绿色箭头左边的实心绿色箭头按钮代表的是以调试模式启动,在该模式下,你可以更方便的寻找Bug,修改代码,但同时对电脑配置的要求较高,建议结合实际情况考虑是否使用
调试模式下常用的有以下功能:
- 热重载:即左边的火焰按钮,你可以在启动游戏后修改代码(仅部分操作允许,如我们不能定义新的方法),使用热重载后代码能够直接生效而不需要重新生成Mod并加载
- 断点:我们可以点击代码左侧边框给一行代码加上断点,这样程序在运行到这行代码时便会自动暂停,此时你可以按F10,F11来逐行执行代码
- 监视:需配合断点使用,在命中断点后可以实时观察各个变量的值
- 异常:当程序抛出异常时,VS可以自动跳转至那行代码,而不用通过Log找到文件和行数(这个行数还不一定靠谱)
我这里给你们几个任务,可以去试着完成
- 把这把剑的攻击力改为1
Item.damage = 1;
- 把这把剑的攻击速度改为一秒10次
Item.useTime = 6; item.useAnimation = 6;
- 把这把剑的击退改为0
Item.knockBack = 0f;
- 把这把剑的攻击方式改成跟同志短剑(1.3,如果没玩过就请理解成类似伞的攻击方式)一样
Item.useStyle = ItemUseStyleID.Thrust;
如果你正确的完成了这几个任务,那么这把剑就会像这样
(相信我,这把剑用久了你对距离的把控将会炉火纯青,特别是对于带武器的僵尸,因为这把剑对他们的无伤攻击区域只有几像素
如果你成功完成了上面的几个任务,那么你就掌握了基本的物品属性修改方式。享受你的成果吧。记得修改以后一定要保存才有效果哦。
课后习题
基础
- 假如某个物品的类名处于命名空间
FallenStar49.Items.Accessories.Expert
下,假设没有其他修改,那么它的默认图片路径是?答案FallenStar49\Items\Accessories\Expert
- 假如我把
SkirtSword
类的命名空间改为TemplateMod2.Item
会出什么错?答案TemplateMod2/Item这个文件夹不存在,所以会出现找不到资源的错误 - 试一下
/* */
格式的注释,看看它和//
的区别在哪里?答案/* */
是多行注释,可以跨越很多行,而//
只能注释这一行
好耶!
讲的很详细,喜欢11