自定义纹理

自定义纹理

允许您使用自定义PNG文件替换游戏纹理实例。

视觉效果与图形

描述

此模组应允许您替换以下内容:

  • 玩家模型纹理
  • 物品栏图标
  • 装备纹理,如盔甲、武器和工具
  • 地形和水纹理
  • 环境纹理
  • 特殊地点纹理(村庄、地穴、符文石等)
  • 世界对象纹理,几乎包括游戏世界中的其他一切

它现在还支持图层,因此您可以将多个纹理应用于同一个原版纹理(请参阅下面的图层部分)。

制作你自己的自定义纹理需要基本的阅读理解能力! 这并不难,但在寻求帮助之前,请仔细阅读以下所有信息。

基本用法

为了提取原版纹理作为参考,我使用 Asset Studio。纹理位于 valheim_Data/sharedassets 文件中。

要替换一个纹理,你只需将一个png文件添加到 BepInEx/plugins/CustomTextures 文件夹中,并按照下面解释的正确命名格式命名,然后加载游戏。

你也可以将纹理组织到子文件夹中!如果你正在发布一个纹理包,我鼓励你这样做,以便轻松安装和卸载。

另外,如果你要发布一个纹理包,在创建zip文件之前将你的纹理放入 CustomTextures 文件夹中,可以让Vortex自动安装它们!

要重新加载游戏中的世界纹理,有一个快捷键(默认为 Page Down)。注意:这不会重新加载任何原版纹理,因此如果您删除了自定义纹理文件,您需要重新启动游戏才能再次看到原版纹理。

要查看使用此模组创建自定义纹理的模组列表,请点击本描述上方的“需求”选项。

这里有一个好心人的视频,教你如何使用这个模本搭配预制纹理包。

过滤模式

Valheim 纹理使用点过滤,这使得它们在近距离看起来像素化。如果您想使用双线性或三线性过滤以获得更高分辨率的纹理,请将您的纹理放在名为 bilineartrilinear 的子文件夹中,模组将更改这些纹理的过滤模式(如果您选择,它们仍然可以位于子子文件夹中)。

文件命名摘要

文件名由最多四部分组成:前缀、标识符、属性名和层名。要获取大部分此类信息,请使用场景转储(参见下方的场景转储部分)。

您创建的文件名以前缀开头,通常后跟下划线,然后是标识符,接着是属性名称(可选地再跟下划线和图层名称,如“图层”部分所述),即对于完整的纹理替换:

<前缀>_<标识符><属性名称>.png

或用于图层:

<前缀>_<标识符><属性名>_<图层名>.png

你最终会得到一个类似这样的文件名,并将其放置在 CustomTextures 文件夹中的某个位置。

属性名称通常以下划线为前缀,所以也不要忘记这一点。 此外,如果你的Windows隐藏了文件扩展名,不要在末尾添加 .png,否则你会得到一个名为 <prefix>_<identifier><propertyName>.png.png 的文件,这无法使用。说真的,让Windows显示文件扩展名吧,它默认不显示实在太蠢了。

以下是四个部分的详细说明:

前缀

以下前缀已实现,基于被修改事物的类型:

  • player_model 用于玩家纹理
  • atlas_item_icons 用于物品栏图标
  • object 用于对象纹理
  • armor 用于盔甲纹理
  • zone 用于水域纹理
  • terrain 用于地形纹理
  • environment 用于环境纹理
  • location 用于特殊地点

对于对象、水体、地形、环境和位置纹理,前缀可以进一步修改如下:

  • <prefix>renderer - 用于替换特定命名物件上特定命名渲染器的纹理
  • <prefix>mat - 用于替换特定命名物件上特定命名材质的纹理
  • <prefix>renderermat - 用于替换特定命名物件上特定命名渲染器中特定命名材质的纹理
  • <prefix>texture - 用于替换特定命名物件上特定命名纹理

例如:

environmentrenderermat_YggdrasilBranch_branch_yggdrasil_branch (Instance)_MainTex.png

将替换 YggdrasilBranch 环境对象上 branch 渲染器中的 yggdrasil_branch(实例) 材质上的主纹理。

您也可以根据组件的名称使用以下前缀:

  • texture for universally replacing a texture (where supported)
  • renderer for replacing the texture on any named renderer
  • mat for replacing the texture on any named material:

所以,一些更简单的方法来完成上述操作是:

texture_yggbark_d_MainTex.png
mat_yggdrasil_branch (Instance)_MainTex.png

标识符

您可以在场景转储中找到与上述前缀一起使用的标识符。更多详情请参阅以下各详细部分。

属性名称

你可以在场景转储中找到属性名称。通常你会想要替换 _MainTex,可能还有 _BumpMap_SkinBumpMap

图层名称:

请参阅下面的图层。

替换类型

以下是每种替换类型的详细信息:

玩家材质

对于基础玩家角色纹理,请使用以下语法:

player_model_<模型编号><后缀>.png

<modelNumber> 替换为 0(男性)或 1(女性)。例如:

player_model_1_MainTex.png

物品库存图标

这些是在你的物品栏中显示的小图像,代表游戏中的物品。它们都位于一个名为 sactx-2048x2048-Uncompressed-IconAtlas-61238c20 #845 的单一图形上。

要替换物品栏图标表,请创建一个等效的表,命名为:

atlas_item_icons.png

你可以使用任何分辨率,因为它会被缩放以适应。

你也可以使用图层替换单个物品图标(见下文图层部分)。

物体与护甲纹理

注意: 装备和世界物品现在都被视为对象。该模组仍会识别 items_ 前缀,仅为了向后兼容。

除了玩家模型和物品栏图标外,此模组影响的所有其他内容都被视为对象。

例如:

  • 煤炭和木材等资源
  • 锤子和耕作机等工具
  • 植物、树木、灌木丛
  • 建筑积木
  • 敌人

盔甲用于表示当你穿着该物品时的外观(与将其和其他垃圾一起扔在地上时的外观相对)。

这些内容的通用文件名语法为:

<前缀>_<标识符><后缀>.png

前缀:

以下物品和护甲前缀现已实装:

  • object - 用于更改特定世界对象类型上所有类型为 <suffix> 的纹理。<identifier> 应为对象生成名称
  • objectrenderer (objectmesh 也可用,但已弃用) - 用于更改特定对象上特定渲染器上所有类型为 <suffix> 的纹理。<identifier>(参见标识符)应为对象名称和渲染器名称,用下划线分隔:<objectName>_<rendererName>
  • objecttexture - 用于更改特定对象上每个渲染器上特定命名的类型为 <suffix> 的纹理。<identifier>(参见标识符)应为对象名称和纹理名称,用下划线分隔:<objectName>_<textureName>
  • objectmat - 用于更改特定对象上所有特定命名材质上的纹理。<identifier>(参见标识符)应为对象名称和材质名称,用下划线分隔:<objectName>_<materialName>
  • objectrenderermat - 用于更改特定对象上特定命名渲染器上特定命名材质上的纹理。<identifier>(参见标识符)应为对象名称和材质名称,用下划线分隔:<objectName>_<rendererName>_<materialName>
  • texture - 用于更改所有使用该纹理的对象和物品上特定 <后缀> 类型纹理的所有实例。<标识符>(参见标识符)应为纹理名称(不一定是导出的文件名!)
  • renderer - 用于更改所有对象和物品上特定渲染器所有实例的 <后缀> 类型纹理。<标识符>(参见标识符)应为渲染器名称。
  • mat - 用于更改所有对象和物品上特定材质所有实例的 <后缀> 类型纹理。<标识符>(参见标识符)应为材质名称。
  • armor - 用于更改护甲物品的胸甲或腿甲部分 - 请注意护甲其余部分受 object_ 影响而非此项。

后缀:

注意:后缀已全面更新。旧的 _texture_bump 后缀仍被识别,但应替换为实际属性名称。

后缀告诉模组你想要替换的纹理,称为“属性”。

场景转储提供了对象上每个材质的属性列表,例如:

object ArmorIronChest 拥有 1 个蒙皮网格渲染器:
    蒙皮网格渲染器名称:铁甲
        smr 铁甲拥有 1 种材料
            铁胸甲材质(实例):
                属性:
                    _主贴图 铁胸甲_d
                    _凹凸贴图 铁胸甲_n
                    _自发光贴图
                    _金属光泽贴图 铁质胸甲_m
                    _样式纹理
armor ArmorIronChest 材质为:
    护甲名称:铁甲玩家_胸甲
            属性:
                _主纹理
                _胸部碰撞贴图 铁甲胸甲玩家_n
                _胸甲金属铁甲胸甲玩家_m
                _胸甲纹理 铁甲胸甲玩家_d
                _腿部凹凸贴图
                _腿部金属
                _腿部纹理
                _皮肤凹凸贴图

该对象同时具有蒙皮网格渲染器和盔甲材质。它们是分开的。

  • 对象 是所有那些附着在玩家身上的华丽部件。
  • 盔甲 是粘贴到玩家腿部和胸部的纹理。

每个属性都显示其纹理名称(如果有的话),例如,对象的 _MainTex 名称是 IronArmorChest_d

_MainTex 指的是主纹理。通常这是你想要替换的那个。然而,对于盔甲来说,替换 _MainTex 可能不会产生任何效果——将其替换为透明纹理似乎效果最佳。要改变实际的盔甲,你需要使用 _ChestTex 和 / 或 _LegsTex,并确保它只覆盖实际盔甲的区域(例如,请参阅导出的 IronArmorChestPlayer_m.png)。因此,你需要创建以下内容:

object_ArmorIronChest_MainTex.png
armor_ArmorIronChest_ChestTex.png

盔甲很复杂,最好多尝试!

标识符

要获取对象的标识符,请使用此处生成列表中的名称:https://www.reddit.com/r/valheim/comments/lig8ml/spawn_item_command_list/

它们也会出现在上述的场景转储中。

水和地形纹理

水和地形纹理使用与对象类似的语法,即:

<前缀>_<标识符><后缀>.png

水纹理位于区域对象内部,因此在场景转储中您将看到:

zone _GameMain 有 2 个 MeshRenderers:
    网格渲染器名称:水面
        水面先生有1种材质
            水(实例):
                属性:
                    _泡沫材质泡沫
                    _正常 nRHPu
                    _高分辨率泡沫纹理 foam_highres
                    _法线精细 法线贴图2
                    _随机泡沫纹理 随机_泡沫
    网格渲染器名称:sub_water_opak_thingyu
        mr sub_water_opak_thingyu 拥有 1 种材料
            水底平面(实例):
                属性:

这里的前缀是 zone,所以使用,例如:

zone__GameMain_FoamTex.png

(注意双下划线!)

地形

在区域入口后,你会看到:

地形 _GameMain,预制体 _Zone (UnityEngine.GameObject)
                属性:
                    _主纹理 草地
                    _噪波纹理 噪波
                    _已清除遮罩纹理
                    _悬崖法线 水彩岩石_大_北
                    _已培育正常 cultivated_n
                    _DiffuseTex0 漫反射贴图0
                    _泥土法线 dirt_normal_generated
                    _普通森林 森林_普通
                    _草普通草_普通_已生成
                    _铺装法线 paved_n
                    _岩石标准 水粉岩石_n
                    _雪正常 雪_正常

这里的词缀是地形,所以使用,例如:

terrain__GameMain_DiffuseTex0.png

diffuse0 纹理似乎包含十六个不同地形类型的图块。您可以在屏幕截图中看到其使用示例。

环境纹理

环境纹理包括雨、云、雾,还有天上那个巨大的树状物体。

场景转储显示,例如:

环境 世界树分支 有 1 个网格渲染器:
    网格渲染器名称:branch
        mr branch 拥有 2 种材料
            世界树之枝(实例):
                属性:
                    _主纹理 yggbark_d
                    _凹凸贴图 yggbark_n
                    _自发光纹理 世界树_发光
                    _苔藓纹理 ygg_moss
                    _自发光遮罩纹理 世界树_自发光遮罩
                    _折射法线
            世界树分支之叶(实例):
                属性:
                    _主纹理 ygg_leaf_d
                    _凹凸贴图 ygg_leaf_n
                    _自发光纹理
                    _苔藓材质
                    _自发光遮罩纹理
                    _折射法线

所以,如上所述:

environmentrenderermat_branch_yggdrasil_branch (Instance)_MainTex.png

将替换 YggdrasilBranch 环境对象上 branch 渲染器中 yggdrasil_branch(实例) 材质的主纹理。

特殊地点

Location prefabs 与游戏中的其他模型是分开的,因此必须单独处理。它们包含大量渲染器,所以遍历过程可能非常耗时。出于这个原因,你可以在配置中禁用位置替换功能。此外,位置必须使用位置前缀(texture_ 将不会产生任何效果)。

图层

图层允许你在现有或修改的纹理上应用部分纹理。对于除精灵外的所有对象,其工作方式相同:

纹理图层

要为除精灵表外的任何内容添加图层,请使用与在上述相应部分替换该类型纹理相同的语法,并在末尾添加 _<你的图层名称>。例如,对于名为 RealEyes 模组的玩家眼睛纹理,应为:

player_model_0_MainTex_RealEyes.png

<YourLayerName> 可以设置为你想要的任何名称,只要它是唯一的且不包含任何下划线。

精灵图层

物品图标表的精灵图层工作方式不同,会完全覆盖精灵表的一个补丁区域。因此,精灵图层png应仅包含你想要替换的补丁区域的大小。物品图标图层的文件格式如下:

atlas_item_icons_<startX>_<startY>_<sheetWidth>_<sheetHeight>.png

这是因为你可能正在使用放大后的纹理,因此需要让模组知道你正在处理的虚拟工作表有多大。模组会将其与现有工作表(或被其他纹理替换的工作表)进行比较,并据此计算出你的图层纹理的比例。例如,要替换木盾纹理,我使用一个名为的64x64像素png文件:

atlas_item_icons_1224_1840_2048_2048.png

这告诉它我的 png 来自一张2048x2048像素的大图(与原版图尺寸相同),并用我64x64像素的 png 替换现有图,以像素1224x1840作为左上角起点。

示例

让我们以场景转储中的一个例子为例:

object VikingShip 拥有 1 个蒙皮网格渲染器:
    蒙皮网格渲染器名称:sail_full
        smr sail_full 有 1 种材料
            航行(实例):
                属性:
                    _主纹理 帆布_漫反射
                    _BumpMap 船帆法线贴图
                    _自发光纹理
                    _苔藓纹理

您可以根据需要选择使用哪个前缀和标识符:

  1. 设置对象类型上的所有纹理

object_VikingShip_MainTex.png

这将替换对象中每个材质的主纹理,因此如果对象使用多个纹理,可能效果不佳。这不适用于我们的示例,因为飞船上也有许多网格渲染器。如果我们想要更改凹凸贴图,可以使用:

object_VikingShip_BumpMap.png

  1. 设置纹理的所有实例

texture_sail_diffuse_MainTex.png

这将替换所有名为 sail_diffuse 的纹理,因此使用该纹理的每个对象都应受到影响。在我们的示例中,它会替换船帆,如果其他船型使用该纹理,也会显示。

  1. 为对象类型上的单个网格设置纹理

objectrenderer_VikingShip_sail_full_MainTex.png

这将替换所有维京船对象上名为 sail_full 的渲染器的纹理。

  1. 通过名称在对象类型上设置纹理

objecttexture_VikingShip_sail_diffuse_MainTex.png

这将替换所有维京船对象上名为 sail_diffuse 的任何纹理。

  1. 设置局部纹理图层

上述任何示例也可以通过在其末尾添加图层名称来作为部分图层添加。因此,如果您只想在维京船的帆上添加一个贴花,您可以这样做:

objecttexture_VikingShip_sail_diffuse_MainTex_CoolSkullAndCrossBones.png

配置

运行一次游戏后,会创建一个配置文件 BepInEx/config/aedenthorn.CustomTextures.cfg

您可以通过使用文本编辑器编辑此文件或在游戏中使用配置管理器来调整配置值。

场景转储

要获取制作以上名称所需的所有信息,请将配置选项 DumpSceneTextures 设置为 true,然后运行游戏并加载进入您的世界一次。文件 BepInEx/plugins/CustomTextures/scene_dump.txt 应该会被创建。在您转储纹理后可以将其设置回 false,否则每次运行游戏时都会重新创建该文件。

技术

要安装这个模组,最简单的方法是使用 Vortex,即 Nexus Mods 的模组管理器。它会处理所有依赖项。

要手动安装,请将 dll 文件放入 BepInEx/plugins 文件夹中。你需要 BepInEx

代码位于 https://github.com/aedenthorn/ValheimMods

如果你想抱怨、寻求帮助或协助我测试模组,可以访问我的 Discord服务器

点击此处查看我为《英灵神殿》制作的所有模组列表:所有模组列表