
《Edengrall的日常生活》支持模组功能,本指南将引导你完成简单及复杂模组的创建流程。 创建模组 要为《Edengrall的日常生活》创建模组,请在主界面打开模组选项,然后点击【创建模组】按钮。 游戏会询问你希望创建简单模组还是复杂模组。

简单模组 仅添加或修改图像、文本或XML文件的模组为简单模组,无需编译任何代码,只需创建文件夹并将文件拖入其中。 简单模组可以包含更复杂的资源,但这需要通过Unity创建资源包,本指南稍后会以示例模组的形式对此进行探讨。

创建简单模组时,你的模组文件夹中会生成一个包含基础文件的文件夹。请务必编辑清单文件以添加描述,并将Preview.png替换为尺寸相同的其他图片。

简单模组会附带一个空白的英文语言文件,此文件为可选内容,你可以将其删除或替换为其他语言的文件。 复杂模组 这类模组用于添加或修改脚本。复杂模组能够改变游戏的基本功能,其创建和维护需要更多专业知识。这类模组需要对代码进行编译,因此你需要一个集成开发环境。

我们建议使用Visual Studio或JetBrains Rider作为集成开发环境。 创建复杂模组时,模组文件夹初始为空,待编译的代码将在另一个文件夹中创建,只有在编译完成后,内容才会转移到实际的模组文件夹中。这样,源代码文件不会被放入要上传至Steam的文件夹内,但如果你希望分享源代码文件供其他模组制作者查看,仍可以将其打包为压缩文件包含在内。




示例模组:简易家具模组:创建资源包 默认情况下,简易模组仅会导入文本和图像文件。若要添加模型、材质、音效、动画等更复杂的资源,则需要创建资源包。 资源包必须通过Unity进行打包,因此你需要安装Unity引擎。建议使用与游戏相同的Unity版本,游戏版本号后的启动界面顶部可查看Unity版本。 家具物品包含网格和材质资源,因此需要创建资源包才能正常运行。 资源包文件:对于添加非文本、图像或代码类内容的模组,此文件为必需。这是注入网格、材质、音频文件等内容的唯一方法。必须通过Unity引擎编辑器创建。首先,让我们创建一个新的简单模组。


保持mod文件夹打开,但现在可以关闭游戏。 要创建资源包,请打开Unity并新建一个Unity 3D项目。


首先创建一个新的脚本用于打包资源包。此脚本不会被游戏运行,仅由Unity用于打包资源,不会成为模组本身的一部分。

复制以下代码并替换默认脚本内容,同时将脚本重命名为“AssetBundleExporter” #if UNITY_EDITOR using System.IO; using UnityEditor; public class CreateAssetBundles { [MenuItem ("Assets/Build AssetBundles")] static void BuildAllAssetBundles () { Directory.CreateDirectory("Assets/AssetBundles"); BuildPipeline.BuildAssetBundles ("Assets/AssetBundles", BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows); } } #endif


此脚本将把我们的资源打包成游戏可导入的资源包。这些是我们的资源,我们在Blender中创建了模型,还使用Blender的纹理绘制模式制作了纹理,图标则基于模型的截图。我们的图标采用256x256的PNG格式。

桌子和椅子使用相同的纹理,但如果你想要更精细的模型,可以为它们分别制作一个。现在将你的模组内容拖入项目中。

使用我们之前制作的纹理创建材质,你也可以添加高度图和法线贴图,以获得更详细的材质。

配置网格,我们的网格没有需要导入的动画或骨骼绑定,因此请确保将其设置为无,同时不要导入网格材质,因为我们已在Unity中自行制作了材质。

【读写启用】为必填项,其他设置仅为建议。在场景视图中预览模型和材质为可选操作。

创建新的资源包。选择任意资源,然后在检视面板底部找到【资源包】选项。

将所需资源指定为资源包的一部分,确保所有Blend文件、图像和材质都分配到同一个资源包中。

我们还建议将图标转换为精灵图,因为它们是用户界面元素。

将所有资源分配到资源包后,编译资源包。此时会出现一个包含已打包资源的新文件夹。

将资源包及其清单复制到我们之前创建的模组文件夹中。现在你可以关闭Unity项目了,我们不再需要它。


资源包已完成,现在继续进行下一部分的内容和必要的模组文件制作。 示例模组:简易家具模组:内容与模组完成 我们已在模组文件夹中放置了资源包。现在需要编辑本地化文件、内容描述符XML、修改清单文件,并为模组页面制作一张精美的图片。 本地化文件 - 任何以“Language;(你的语言)”开头的CSV文件都将被视为语言文件。它可以有任意名称,适用于任何语言。如果存在至少一个对应语言的文件,游戏会在设置中自动添加新的语言选项。这是此模组的文件: 语言;中文 示例椅子名称;软木椅 示例椅子描述;由软木制成的椅子 示例桌子名称;软木桌 示例桌子描述;由软木制成的桌子 内容描述文件 - 所有以“.xml”结尾的文件都将被检查是否存在内容描述文件。这些文件由以下内容开头的xml文件定义: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <GameDefs> 创建xml文件只需新建一个文本文件,然后将文件扩展名从.txt更改为.xml即可。 你可以根据需要将模组内容拆分为任意数量的文件或文件夹。我们建议为每种类型的内容单独创建一个文件,例如一个用于家具,另一个用于建筑材料,但你也可以将所有内容都放在一个文件中。


这是此模组内容文件: <?xml version="1.0" encoding="utf-8" standalone="yes"?> <GameDefs> <ItemDef> <Entity> <UniqueID>Game.Base.Items.Buildable.ExampleChair</UniqueID> <ItemDefinition> <name>$$ExampleChairName$$</name> <description>$$ExampleChairDesc$$</description> <icon> <path>$MOD_ROOT$/Assets/chairandtable./软木椅</path> </icon> <noAmount/> </物品定义> <可建造> <家具/> <位置>家具</位置> <网格>$MOD_ROOT$/Assets/chairandtable./普通椅子</网格> <碰撞>$MOD_ROOT$/Assets/chairandtable./普通椅子碰撞</碰撞> <材质>$MOD_ROOT$/Assets/chairandtable./软木桌子</材质> <耐力消耗>1</耐力消耗> <建造成本> <物品ID>Game.Base.Items.Crafting.<物品ID>软木棒</物品ID> <数量>100</数量> </建筑成本> <家具挂钩> <x>0.3</x> <y>0</y> <z>0.3</z> </家具挂钩> <家具挂钩> <x>-0.3</x> <y>0</y> <z>0.3</z> </家具挂钩> <家具挂钩> <x>0.3</x> <y>0</y> <z>-0.</z><ItemDef> <Entity> <UniqueID>Game.Base.Items.Buildable.ExampleTable</UniqueID> <ItemDefinition> <name>$$ExampleChairTable$$</name> <description>$$ExampleTableDesc$$</description> <icon> <path>$MOD_ROOT$/Assets/chairandtable./软木桌</路径> </图标> <无数量/> </物品定义> <可建造> <家具/> <位置>家具</位置> <网格>$MOD_ROOT$/Assets/chairandtable./软木桌</网格> <碰撞>$MOD_ROOT$/Assets/chairandtable./软木桌碰撞</碰撞> <材质>$MOD_ROOT$/Assets/chairandtable./软木桌</材质> <耐力消耗>10</耐力消耗> <建造成本> <物品ID>Game.Base.Items.Crafting.物品ID:SoftWoodenSticks,数量:50 物品ID:Game.Base.Items.Crafting.SoftWoodenPlanks,数量:80 家具挂钩坐标:x:0.5,y:0,z:0.3 家具挂钩坐标:x:-0.5,y:0,z:0Mod清单 - 必须命名为Manifest.xml,且为必需文件。以下是可能的值: <名称> 模组名称 <描述> 模组描述 <模组版本> 模组版本 <类型> 模组类型,任何值均可 <适用游戏版本> 制作此模组所针对的游戏版本,在版本后添加+表示兼容所有后续版本 <依赖项> 此模组的依赖及其版本,若已使用<适用游戏版本>,则无需在此处添加主模块,此处仅为示例 <依赖项> 如有多个依赖项,请重复此条 此模组的Manifest.xml <?xml version="1.0" encoding="utf-8" standalone="yes"?> <Manifest> <Name>软木桌椅</Name> <Description>添加软木桌椅用于装饰你的家园!</Description> <ModVersion>1.0</ModVersion> <ForVersion>V0.30.0.4+</ForVersion> <Type>内容</Type> <Requires>Everyday Life Edengrall:V0.30.0.4+</Requires> </Manifest> Preview.png - 默认上传至Steam创意工坊的图片,图片尺寸必须为636x358

测试模组 模组现已准备好进行测试,请打开游戏,将模组从可用列表拖动到激活列表,然后重启游戏。

现在开始游戏并测试你的创作


上传至Steam

在测试并确保你的模组不会造成任何问题后,你可以将其上传至Steam。在模组加载器中选择该模组并点击上传按钮,首次上传时你需要同意Steam的订阅协议。 如果一切顺利,浏览器窗口会打开工坊页面,以便你进一步编辑。 示例模组:自定义角色模型:创建模组 步骤1:下载Unity引擎,本指南将使用2020.3.46f1版本。

步骤1.1(可选):我们已创建一个包含部分资源的示例项目,可在后续步骤中提供帮助。你也可以选择创建一个空项目。打开示例项目,开始制作模组吧。

步骤2:如果你要从商店下载资源,可以在浏览器中打开商店并点击【在Unity中打开】按钮,这将打开包管理器,在其中点击下载并导入到项目中。

将模型导入项目后,找到在预览中显示完全纹理化的资源,将其拖入场景视图。如果导入的模型没有预先制作好的完全纹理化预制件,你需要自行创建,但这超出了本指南的范围。

步骤3:我们需要修改预制体,对其进行添加或移除操作前需要将其解包。右键点击层级菜单中的预制体,然后选择【完全解包】。

步骤4:选择模型绑定中最高层级的部分(在本示例中为Character1_Reference),创建一个空父级,并将其重命名为【metarig】

步骤5:找到脚部骨骼,并在每个骨骼上添加一个物体,分别命名为toe_L和toe_R。不要重命名现有的骨骼。如果你正在制作自己的模型,可以将骨骼直接命名为toe_L和toe_R。这是脚步声功能所必需的设置。

步骤6:找到头部骨骼,并在角色头部顶端添加一个游戏对象(如果该对象创建在头部底部,请将其向上拖动至顶部;部分模型的头部顶端有用于佩戴饰品等的骨骼,可直接使用该骨骼),然后将其重命名为【Height_Measurer】,该对象将用于在游戏内测量角色高度。

步骤7:找到右手骨骼,为其添加一个名为【ToolAttach】的新对象。旋转该对象,直至蓝色箭头指向前方、绿色箭头指向下方、红色箭头指向角色。你需要旋转或调整此额外对象的大小,以确保工具能完美适配角色。提供的项目包含一些动画和工具可帮助你完成此操作,但由于游戏内不同动画会进行混合,其实际表现可能略有不同。 步骤7.1(可选):使用示例项目中包含的工具和动画来正确设置【ToolAttach】对象,将某个示例工具放置到【ToolAttach】对象内,将动画器中的控制器更改为【Test Controller】,然后播放动画进行测试。

在这个示例中,我们需要同时调整工具附着对象的旋转、位置和缩放,以缩小工具并将其放置在正确位置。完成工具附着过渡的设置后,请删除示例工具并移除动画控制器。


步骤8:从模型中移除所有脚本或将其创建为程序集。 步骤8.1(可选):由于我们需要一些Unity-chan脚本,将所有要随该角色导出的脚本移动到同一文件夹(我们已创建一个名为“Export”的新文件夹),并在该文件夹上创建程序集定义文件。哪些脚本保留、哪些脚本移除因模型而异。在这种情况下,我们保留用于布料/毛发物理效果的脚本以及使她的眼睛周期性眨眼的脚本。

我们已将程序集定义文件命名为“UnityChanAssembly” 步骤9:将角色对象拖入任意项目文件夹,将其制作成预制件

现在选择预制体,在检视面板底部会有一个资源包选项,点击新建按钮并命名资源包,这里我们将其命名为【unitychan】。

步骤10:创建模组,启动游戏,在主菜单中进入【模组】并创建一个新的简单模组

游戏将为你打开mod文件夹。你的电脑可能会基于杀毒软件或权限设置阻止此操作,如果文件资源管理器未在mod文件夹中打开,你可以在【Steam文件夹】steamapps common Everyday Life Edengrall mods【Mod名称】中找到它。 步骤11:构建你的项目,我们只需要其中的一个文件,前往文件夹ProjectName_Data Managed并找到UnityChanAssembly.dll,复制该文件并粘贴到我们创建的mod的基础文件夹中。

将其复制粘贴到模组文件夹中,你可以删除构建过程中生成的其他所有内容。

步骤12:按照自定义资源指南执行资源包生成器脚本,然后将生成的资源包及其清单复制粘贴到模组文件夹中。我们需要的文件位于【项目文件夹】/Assets/AssetBundles,在这个案例中,所需文件为unitychan和unitychan.manifest,将这些文件复制并粘贴到模组的Assets文件夹内。 步骤13:创建一个引用该模型的xml文件。

现在在模组的Assets文件夹中,我们来创建Models.xml,这是游戏检测模型所必需的文件。 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <GameDefs Priority="1"> <Entity> <UniqueID>Game.CustomModels.UnityChan</UniqueID> <CustomModel> <Name>Unity Chan</Name> <EquipmentType>Custom</EquipmentType> <ResourcesPath>$MOD_ROOT$/Assets/unitychan./unitychan_dynamic</ResourcesPath> </CustomModel> </Entity> </GameDefs> 现在加载模组并开始新游戏。

将男性角色切换为自定义模型后,你应该能看到Unity酱,随时可以使用。 示例模组:自定义角色模型:独特NPC台词 如果你希望NPC为你的角色配备独特台词,我们需要添加一个新文件。

在模组的Assets文件夹中创建CharacterTexts.xml文件,打开该文件并粘贴以下内容。 <?xml version="1.0" encoding="utf-8" standalone="yes"?> <GameDefs Priority="1"> <Entity> <UniqueID>SashaGreetUnityChan</UniqueID> <TriviaEntry> <Tags>问候</Tags> <CanAppear> <All> <IsVariableSet> <SetString>自定义角色</SetString> <StringValue>Game.CustomModels.UnityChan</StringValue> </IsVariableSet> <IsNPC> <ID>Game.Base.Items.Characters.萨莎</ID> </IsNPC> </All> </CanAppear> <OnAppear> <SetRolledToday> <Key>#PARENTENTITY#</Key> </SetRolledToday> </OnAppear> <Weight> <FixedModifier> <Modifier>0.无法识别内容,已删除。我们在此处添加了一个名为SashaGreetUnityChan的条目,当你使用Unity-Chan模型时,萨沙会对你有独特的问候语。 这行文本优先级较高,应该是萨沙在初次见面后对你的第一个问候。你可以通过移除以下内容来取消高优先级,使其表现得像普通文本: <FixedModifier> <Modifier>0.999</Modifier> </FixedModifier> 请记住,我们必须将该条目添加到mod的Assets文件夹中的English.csv文件里。 语言;英语 SashaGreetUnityChan;哇哦,你就是那个Unity Chan吗?太厉害了!示例模组:本地化 要将游戏本地化为其他语言,你需要在模组的任意位置添加一个语言.csv文件: 语言;示例语言 仅需这样操作,游戏就能识别你添加的新语言。 然后加载该模组,进入语言设置并选择你添加的新语言。

为了方便追踪尚未翻译的内容,我们在语言设置中添加了一个名为【复制[X]条缺失字符串到剪贴板】的按钮。 打开您的.csv文件并粘贴复制的内容,您会得到类似以下格式的数据: Language;Example Language HELLO1;你好 HELLO2;嘿,呵! LastForForever;永远 Window:XML/Window/InventoryXML;背包 Window:Cooking Window;烹饪 Window:XML/Components/confirmpopup;确认 WorldTooltip.Utensil.Cooking;烹饪$$0$$。 Utensils.Portable.Raw;生食处理 Utensils.Table.Raw;生食处理 Utensils.Stove.Pot;锅 Utensils.Stove.Pan;平底锅 Utensils.Campfire.Pot;锅 Utensils.Campfire.Pan;平底锅 Utensils.Oven;烤箱 Utensils.Campfire.Spit;烤架 Utensils.Grill;烤架 Utensils.Steamer;蒸锅 ....再多10,000行文本 每行由分号(;)分隔,仅翻译分号后的内容,分号前的是游戏用于查找可翻译字符串的键值。 示例行中每行都包含默认英文字符串,因此翻译文件后若在游戏中看到英文文本,说明您漏译了某行。 若看到带有"$$X$$"等符号的条目,请勿删除,这些符号会在运行时被某些变量或字符串替换,例如:"UIDayHour;$$1$$天$$2$$小时" 在此示例中,游戏会查找"$$1$$"并将其替换为天数,查找"$$2$$"并将其替换为小时数。 当游戏更新并添加新行(如新物品名称等)时。只需再次按下按钮,系统就会仅提供你所选语言中不存在的新文本行,从而让翻译模组的更新变得轻松。
