跳至正文

夜谷紫幽:新人常见问题汇总(FAQ)

“生活会欺骗你,但程序不会”

“可是我按照教程一步一步来怎么就编译不了呢??”

我是夜谷紫幽,刚入坑的新人常常会碰到一些神奇的问题(打造一个适合写mod的环境真是件美逝啊),以下收录了一些教程未提及并且比较常见的问题,如果碰到bug了可以来这看看哦(Tips : 可以使用搜索查找关键词)


编译时错误


报错Object或Collection,找不到.NETFramework 4.5程序集(1.3版本)

就像这样
还有这样
或者是这样(感谢来自VS的友情报错)

此类问题源于未下载或无法找到.net framework 4.5

解决方法一:(推荐)

从Visual Studio Community2019下载.net framework 4.5 (2019! 2019! 2019! 重要的事情说3遍,因为微软已经抛弃了.net4.5,所以2022下载不了)

如果你想用VS2022开发的话

当然如果你就是想用VS2019来编写mod就直接选择net桌面开发下载就可以了

解决方法二

既然我就是要下载个.net framework 4.5,为啥不把文件搞到手后直接复制到上面的目录呢?

微软:安装包给你,并且我们十分“贴心的”加入了若存在更高版本的net就无法安装的检测

找不到资源啊!

不过还是有方法的比如找一个有net的人要比如使用NuGet包管理器下载(可以在VS工具栏找到),打开控制台,输入Install-Package Microsoft.NETFramework.ReferenceAssemblies.net45 -Version 1.0.2,然后可以在C:\Users\Administrator.nuget\packages\microsoft.netframework.referenceassemblies.net45\1.0.2\build.NETFramework里找到.net 4.5,放到上面红色框框的目录下就可以了

顺带一提,1.4tml第一次打开时会检测游戏目录下有没有dotnet,没有就自动下载,但是不知道tml是从哪个网站下载的反正中国地区下载不是很慢就是根本下不了,此时我们同样可以找其他人要从微软官网下载二进制文件然后塞到tml游戏目录下的dotnet里

冷知识:tml里编译mod与运行mod是依靠游戏目录下的dotnet,但是vs2022编译mod是靠自己下载的dotnet,缺一个就会报错


为什么MyClass/ItemID/Vector2画红线,报错未找到xxx.png,xxx不存在

此类基本为命名空间(Namespace)的问题

C#里所有东西都有一个命名空间,类似于地址指明一个类/方法在哪里从而避免的重名问题,当我们需要使用一个类时必须知道它是哪个命名空间的,一般来说我们会寻找using后更着的命名空间与当前代码所在命名空间里的类/方法,否则我们需要显式写出命名空间

C#命名空间文档

例如:MyMod.Item.MyFirstItem, Terraria.Item, Terraria.ID.ItemID, Terraria.ModLoader.ModProjectile,Microsoft.Xna.Framework.Vector2

这时候就要提到强大的VS了,在画红线的代码上Alt + Enter可以得到VS的建议,只要不是差得很远VS就可以给出预期的命名空间

Tips:新人不要去using On.xxx与IL.xxx,了解更多内容请参考其他教程

与此同时,TML为便于mod加载(Autoload),制定了一个命名空间与类名的规范,即代码文件.cs与纹理文件.png同名,且位于同一文件夹下,mod物品的命名空间为ModName.FileName1.FileName2……

注意:从别的mod复制过来的东西命名空间一般对不上

例如位于ExampleMod/tems/Weapons文件夹下的ExampleSword,其命名空间为ExampleMod.Items.Weapons

TML对Autoload的说明


模板和ExampleMod无法编译,报错在xxx里不存在xxx,版本问题

1.3的ExampleMod用1.4TML编译

请注意:tml分为1.3与1.4两个版本,可以在属性/测试版里切换,1.3使用net framework4.5,1.4使用net runtime6.0(vs2019不能下6.0,vs2022不能下4.5真是太淦了),同时从1.3到1.4tml代码大幅度变更,导致不同版本代码与模组都无法互通,具体可以参照移民指南版本迁移指南

以下为一些重大变动

Assets 材质文件

现在ModContent.GetTexture被替换为ModContent.Request<Texture>,其将返回一个对材质包装过的类Asset<T>,我们需要使用Asset<T>.Value或者(Texture2D)Asset<T>来获取贴图(Effect类似)

正常情况下,当我们第一次调用Asset<T>.Value时TML才会开始使用异步加载文件,此时Value一定会返回null,所以不能使用public static Texture2D tex; tex = ModContent.Request<Texture2D>().Value

我们可以选择直接在sb.Draw前当场Request,保证只在前几帧内无贴图(但对于Effect等是致命的)

或是使用Request第二个参数AssetRequestMode.ImmediateLoad,阻塞当前程序的运行直至贴图加载完成(与GetTexture相同)

或者是在Mod.Load与Mod.PostSetupContent里进行二次加载,一般在Load里Request的贴图在PostSetupContent里便可加载完成

或是保存Asset<T>,根据当前IsLoad的状态执行相应的代码

对于原版贴图,贴图路径存在改变,具体可以查看1.4资源

原版贴图由Terraria.Main移动到了Terraria.GameContent.TextureAssets,并且确保在调用前调用Main.instance.Load*


VS 与VSC的区别,为什么要用VS

这俩最明显的差距就是大小了,VS甚至可以大于30G

VSC

VSC,又叫VSCode,全称Visual Studio Code,是个五彩斑斓的记事本简化高效的代码编辑器,体积小

最基础的VSC简单来说就是上了色(代码高亮)的记事本(Notepad++点了个赞),但是可以通过安装各种插件来实现很多方便的功能(VS基本都有来着)(比如某群友写的查询物品ID),VSC类似于TML,插件类似于MOD,但我们无法保证这些非官方MOD的质量以及是否会发生冲突,此外VSC的环境配置比较麻烦,对新人很不友好,除非磁盘真的没有空间,否则不建议使用VSC

TML对使用VSC开发的建议

VS

VS,全称Visual Studio,由Visual Studio Installer安装,是一个集成开发环境,体积很大

VS作为集成开发环境,统一性好,Bug少,质量有保证,代码出现错误易于向群友提问,并且提供了一系列方便的功能,如转到定义,自动补全,智能代码,格式修正等等

TML对使用VS开发的建议

VS官方文档

特别是自动补全对萌新十分友好(快捷键Alt + ->),同时VS可直接编译并调试mod,且支持热重载运行在游戏运行时修改部分代码

自动补全
补全命名空间(快捷键Alt + Enter,也可以点击灯泡)

属实是懒人福音了

注:VS分为2019与2022两个版本,2022功能更多且对性能要求更高,一般来说1.3使用VS2019,1.4使用VS2022,若想用VS2022开发1.3tmod请看上文如何下载.net4.5

VS下载慢?可能的解决方法:在host里添加:104.97.154.95 aka.ms


编码错误,中文变乱码

如图

在一个文件中,中文可能由于编码不同从而保存的内容也不同,当我们的mod与tml使用编码存在差异时就会导致乱码的出现,此时我们需要将文件的编码修改为UTF-8

使用VS

在VS中默认不会显示修改编码的选项,此时我们有两种方法

第一是使用 文件/另存为 在保存时有个下拉菜单可以选择编码保存

第二种需要开启高级保存选项的显示,在 工具/自定义/命令/添加命令/左侧文件/右侧高级保存选项 里添加,然后就可以在文件里直接通过高级保存选项来修改文件编码

使用Notepad++

Notepad++是一个体积很小的记事本,提供了很多功能,其中包括了修改编码

打开上面编码一栏就可以看见修改选项


常用的一些寻找解决问题方法的网址

《夜谷紫幽:新人常见问题汇总(FAQ)》有6个想法

  1. Pingback: Kid:1.4Tml疑难解答 - 裙中世界

发表回复