我开始开发这个插件的时候,Dynamic Animation Replacer(DAR)还没有更新到最新的Skyrim版本,而且当时谁也不知道它是否会更新。不久之后,DAR突然更新了,那时我的插件作为DAR的替代品已经取得了显著进展。我决定继续开发,专注于添加新功能并确保其可扩展性。
动画师们对动画替换插件(DAR)有很多期望,但DAR却无法满足。此外,DAR是闭源的,这意味着当原作者不在时,其他人无法对其进行更新。此前,DAR曾因长时间未更新至最新的《上古卷轴5:天际》补丁而导致玩家不得不降级游戏版本,因为他们无法使用一些优秀的动画替换插件。这种情况很可能会再次发生——《上古卷轴5:天际》的Steam私有开发分支已经定期更新一段时间了——这意味着很可能又会有一个(大型?)补丁即将发布,而这可能需要更新SKSE插件。闭源也意味着其他人无法为插件做出贡献。Felisky(DAR的作者)已经表示他们没有时间再制作mod了,因此在可预见的未来,我们很难期待DAR会有任何新功能。动态动画替换是一个非常强大的概念,它催生了许多优秀的mod,我认为它值得进一步迭代和开发。
本插件并非对 Dynamic Animation Replacer 的逆向工程修改。除了与游戏代码交互且只能以一种方式实现的部分之外,它不包含 Dynamic Animation Replacer 的任何代码。它是我基于自身对游戏的研究而独立完成的作品。
在这个插件开发的后期阶段,当我已经基本完成核心部分并专注于游戏内编辑器时,DAR 已经被其他人逆向工程破解了。
发布于 GitHub(后来甚至更糟)
已移植到 CommonLibSSE你可以将来源与我的来源进行比较,就会发现几乎所有内容都完全不同。
Open Animation Replacer 拥有一个 SKSE 插件 API,允许其他插件添加新的功能条件,从而使其他作者能够扩展其功能,而无需完全依赖原作者。我们也欢迎通过 GitHub 上的 pull request 提交插件本身的新功能。
虽然此插件旨在成为动态动画替换器的继任者,并具备完全的向后兼容性和新功能,但请考虑以下事项:
下载和认可 如果你之前没听说过DAR,那它就是DAR。最初的想法是费利斯基提出的。
我对这些新的可能性感到非常兴奋,并期待着利用它们的模组!
- 根据可配置条件动态替换动画。
- 完全向后兼容 使用基于动态动画替换器的模组。
- 许多新条件 也 对现有产品的改进 (例如支持关键字 EditorID)。
- 成对动画 已支持。
- 非演员 支持动画效果。
- 正确替换动画 动画循环 和 回声.
- 过滤掉重复的替换动画 这会增加动画的限制,但不会影响结果。
- 动画变体 便于随机化或顺序变化。
- 可在子模组中使用的模组级条件预设,以最大限度地减少不必要的条件重复。
- 替换子模组可以有 其他设置从而允许发生以下情况:
- 持续轮询 动画播放期间所需条件,导致和 情况变化时立即替换并且新旧动画之间过渡自然。
- 保持动画循环中随机条件的结果这对于移动模组很有用,可以避免动画每隔几步就被替换一次。
- 分享随机结果 整个子模组中,所有动画都是随机生成的。
- 自定义动画中断和替换的混合时间。
- 忽略 这 无触发因素 动画剪辑标志,在原版游戏中某些动画剪辑上启用,通常会导致带注释的动画事件被忽略。
- 设置 必需项目名称 (例如,某个特定的子模组仅加载) 默认男性 或者 默认女性 ETC。)
- 设置包含动画的文件夹名称,以便多个子模组可以…… 包含相同的动画,但不要重复添加。.
- 游戏内编辑器 它允许你在游戏内检查和编辑替换模组的条件、优先级和其他功能,以及 立即地 查看并测试更改。
- 在游戏内编辑器中预览任何替换动画。
- 动画日志用户界面 这有助于识别最近播放的动画。
- 动画事件日志 UI 这对于行为修改者进行实时调试非常有用。
- 动画可以在主菜单中开始预加载。
- 显示动画预加载进度的小型进度条。
- 提高动画限制 至多 32767 每个项目。
- 增加 Havok 堆大小 稳定性更好,动画效果更佳.
- API 适用于其他 SKSE 插件 添加新的自定义条件.
- 所有操作均通过 SKSE 完成。 可以随时安装或卸载.
实验性功能包括:
- 提高动画限制 至多 65534 每个项目。
技术说明如下(供感兴趣的人参考):Havok 行为动画片段包含一个 16 位有符号整数变量 (int16),它代表一个庞大的动画绑定数组中对应条目的索引,该数组会在动画片段激活时读取。int16 值的最大范围是 -32768 到 32767。然而,几乎所有负值部分都未使用。只有 -1 被用作特殊值,例如动画片段未初始化时。此实验性设置修复了游戏代码中所有将该值视为有符号整数的地方,并修改了指令,使其被视为无符号整数 (uint16)。无符号整数的取值范围为 0 到 65535。之前为 -1 的值仍然保留,因此最多只能处理 65534 个动画。此设置被视为实验性设置,因为我可能遗漏了一些需要修复的地方,而且实际上很少有人会达到 32k 的限制。只有在真正需要或好奇的情况下才启用它,不过如果您实际上没有超过限制,可能不会遇到任何潜在问题。 - 禁用预加载 动画。
这个设置对我来说似乎运行良好,但之前有些测试者反映启用后会出现短暂的T字姿势。建议你试一试,它应该会减少游戏内存占用,而且启用后完全不会有动画加载队列。 经证实,该设置存在一些小问题。我仍在寻找其他解决方案,但总的来说,我不建议使用此设置。
替换模组的结构力求保持井然有序。自 2.0.0 版本起,替换模组在任何地方都能被识别。
数据网格确定正确放置替换模组的简便方法是,将其想象成用一个方块中断原始动画路径。
打开动画替换器\我的模组\我的子模组\.
这意味着,对于一个旨在替换最初放置在……中的动画的替换模组来说,
Data\Meshes\actors\character\animations\male\mt_idle.hkx替换模组应该按照以下任一示例放置:
- 数据\网格\打开动画替换器\我的模组\我的子模组\actors\character\animations\male\mt_idle.hkx
- 数据\网格\actors\打开动画替换器\我的模组\我的子模组\角色\动画\男性\mt_idle.hkx
- 数据\网格\演员\角色\打开动画替换器\我的模组\我的子模组\animations\male\mt_idle.hkx
- ETC...
该结构基于以下概念:
替换模组 包含多个
子模组.
每个
替换模组 包含一个或多个
子模组以及一个配置文件(.json),目前仅包含模组名称和描述。
子模组 包含替换动画和一个配置 .json 文件,其中包含有关其中动画的所有信息,例如子模组名称、描述、优先级、条件和其他功能。
这
替换器 🠚
子模组 这种结构之所以存在,主要是因为大多数动画替换模组都是这样运作的——它们包含多个文件夹,每个文件夹都有不同的条件和动画。现在,它们的所有子文件夹都可以整理到一个文件夹中,使结构更加清晰。
OpenAnimationReplacer
├── 替换模组 1
│├── 子模块 A
││├── [动画文件]
││└── config.json<- 子模块配置文件
│├── 子模式 B
││├── [动画文件]
││└── config.json
│└── config.json<- 替换模组配置文件
└── 替换模组 2
├── 子模块 C
│├── [动画文件]
│└── config.json
└── config.json
树状图,旨在可视化所需的结构。
与DAR不同,
文件夹名称并不决定优先级它们可以被命名
随你喜欢! (不过请避免使用非英文字符/符号,因为它们可能无法正确读取——欢迎了解 Unicode 字符串和文件路径的人在 GitHub 上提交 pull request,我已经放弃了)。
您无需使用文本编辑器手动编辑 .json 文件。虽然也可以这样做,但游戏内置编辑器可以完成所有操作,而且使用起来更方便、更安全。 手动编辑配置文件时很容易出现意外错误。
至于向后兼容性,所有放置在 DynamicAnimationReplacer 文件夹中的模组在加载到游戏时都会被读取并转换为新的结构。由于这些模组缺少新功能,因此默认情况下它们都处于关闭状态,所以除了动画循环或回声等随机条件结果重新生成等改进之外,它们的行为应该与之前完全相同。不存在“
替换 mod->子mod 在DAR中,所有DAR模组都被视为
子模组 到一个大
替换模组 称为
遗产 在编辑器里。它们的名称就是文件夹名称。根据有限的信息,我只能做到这样了。
你甚至可以
在游戏中编辑它们 和
保存用户配置不过,我鼓励替换模组的作者提供OAR版本。即使不是为了新功能,至少也是为了更整洁的组织结构。
请记住,游戏运行时无法直接添加或删除模组的动画文件,也无法添加/删除模组本身,所有操作只有在重启游戏后才会生效。不过,您可以在编辑器中禁用动画或子模组。
自从
1.2.0 替换动画可以有多个
变体这是一个更……
舒服的 制作方法
随机动画此前,通过创建多个随机变体来实现。
多个子模组 使用相同的条件集,包括一个随机条件。对于变体,您只需创建
一个子模块 没有任何随机因素。
要在子模组中为动画添加变体,请创建一个子文件夹,该子文件夹位于动画通常存放的位置。将子文件夹命名为“
_variants_[animNameWithoutExtension](所以,对于“
mt_idle.hkx“,文件夹应命名为“
_variants_mt_idle并将所有想要随机化的动画变体都放在该文件夹中。
文件名无关紧要不过,我建议使用某种东西。
短的 (甚至包括 1.hkx、2.hkx 等等)
避免长路径可能带来的问题(所以,而不是“
子模组文件夹/male/mt_idle.hkx,你有
子模组文件夹/male/_variants_mt_idle/1.hkx“ ETC。)
就是这样插件会获取这些动画,并在需要播放替换动画时随机播放。
变体随机化将遵循“
循环/回显随机结果“ 和 ”
分享随机结果“子模组设置,就像随机条件一样。
你可以
配置重量 用于游戏内编辑器中每个变体的随机化,位于子模组的替换动画中。例如:设置一个
重量为 2 变体将使其
参与的可能性是原来的两倍 作为具有以下变体的
重量为 1。为了更清晰易懂:不要过度解读这一步骤。它只是一个可选步骤,会在条件评估完成后运行。唯一的区别在于,它不是选择并播放单个替换动画,而是从所有可能的动画变体中选择一个。
自从
2.2.0 变体版本还有一种额外的模式:
顺序在这种模式下,动画不再随机播放,而是按顺序播放。此外,还可以将某个变体标记为“仅播放一次”,这意味着即使循环播放完毕,该变体也不会再次播放。当替换动画(或整个动画片段)闲置一段时间后,数据(包括序列中下一个变体的索引以及“仅播放一次”的历史记录)将会重置。
在用户模式下编辑子模组。
游戏内用户界面,可通过按以下方式访问:
Shift + O 默认情况下,允许您查看和编辑所有已安装的替换模组。
编辑器乍一看可能有点吓人,但我尽量让它非常易于使用。它有很多提升用户体验的功能,例如按条件复制/粘贴。
右键点击 它们,或者整个条件集,你可以
拖放 条件
重新排序 他们。
你可以
选择 在控制台中输入角色名称,或输入他们的名称
表单ID 在编辑器中,位于左上角。这将把它选作……
当前评估目标当选定目标后,每个条件都会显示一个
图标 表明其要求目前是否得到满足。在某些情况下,相关条件还会提供一个额外的字段,显示……
当前值 正在检查的内容。这有助于轻松识别当前状态,并深入了解任何必要的更改。
编辑器允许您在三种模式之间切换:
检查,
用户, 和
作者.
- 在 检查 在该模式下,编辑功能已禁用,仅提供只读视图。
- 在 作者 在该模式下,更改将直接保存到 config.json 文件。此文件用作 主配置文件 旨在与替换模组本身一起分发。
用户 和 作者 模式,顾名思义,分别是为模组用户和模组作者设计的。主要区别在于点击保存按钮时保存的配置文件。 - 在 用户 模式,一种 用户.json 创建的文件会覆盖所有内容。 config.json 除了子模组的名称和描述之外,该文件将保持不变。此模式允许用户…… 进行个性化调整 替换模组,例如更改优先级、修改条件或禁用动画。 不影响原始文件用户配置文件可以安全删除,原始配置文件也无需删除。 config.json 将改用其他方法。
有一个
附加标签 它提供了一种
所有替换件清单 对于每个动画,
按优先级排序此选项卡旨在方便查看,不允许直接编辑,因为一个子模组中的所有替换动画都共享相同的配置,并且在此视图中无法清楚地了解同一子模组中不同动画之间的关系。
别忘了……
设置菜单有一些
实验性功能 虽然不能百分之百确定它们完美无缺,但根据我的经验,它们运行良好。
编辑将
显示警告 如果多个子模组具有相同的优先级,并且
显示错误 当子模组需要另一个插件或更新版本才能运行时,您可以……
阅读详细信息 经过
点击错误栏 在编辑器底部。
以下是游戏过程中记录动画的随机示例。
想知道
刚才播放的是哪个动画? 想知道
它来自哪里? 我添加动画日志正是为了这个目的。
点击主界面内的按钮即可启用。您可以关闭界面,动画日志将会显示。
游戏过程中保持屏幕常亮.
你可以
自定义要记录的动画 在设置菜单中。某些事件,例如用鼠标缓慢转动时产生的动画回声,往往会造成大量重复触发。
你也可以
启用向 SKSE 日志文件记录日志 如果您想稍后进行分析,可以在设置中进行设置。
自从
2.1.0 有一个
动画事件日志 此外,这主要对行为模组制作者有用,它会列出跟踪参考对象上发生的所有动画事件。
DAR提出的所有条件均已落实。确保与基于 DAR 的模组完全向后兼容是插件开发过程中的首要任务。部分条件已合并,部分条件还新增了可启用的功能。此外,还新增了多个条件。
- 所有用于与某事物进行比较的数值都可以是 静态值指的是 全局变量, 一个 演员价值或者 行为图变量.
- 关键词 可以通过输入以下内容来指定: 编辑ID 相反(例如) 武器武士刀如果多个关键词共享同一个 EditorID,则它们都将匹配。
- 具有子条件列表的条件(或者, 和) 可以是 无限嵌套.
请注意,当您将鼠标悬停在用户界面中的条件及其组成部分上时,所有条件及其组成部分都会显示工具提示说明。
自从
2.2.0 有一个名为“新功能”
预设可以在替换模组中定义多个预设,然后在称为 PRESET 的特殊条件下进行选择。
替换模组的作者们一直要求添加预设功能,以简化配置创建并减少重复工作。替换模组中的子模组通常共享完全相同的条件,只有少数差异,例如不同的武器类型。预设功能正是为了解决这种情况而设计的——只需创建相应的条件块即可。
一次, 和
重复使用 它在子模组中。
请注意预设
未被复制 到子模组配置。唯一保存的是预设值。
姓名。 这
实际内容 预设是
已保存在替换模组配置中.
适用条件:剧透:
展示
- 是形式 - 检查引用是否与指定的格式匹配
- 或者 - 检查子条件是否成立
- 和 - 检查所有子条件是否都为真
- 配备 - 检查参考资料的右手或左手是否配备了指定的形式
- IsEquippedType - 检查参考物品的左手或右手是否装备了指定类型的物品
- IsEquippedHasKeyword - 检查参考物品的左手或右手是否装备了带有指定关键词的物品
- IsEquippedPower - 检查裁判是否在技能栏位装备了指定的法术。
- IsWorn - 检查参考对象是否在任何插槽中装备了指定的表单
- IsWornHasKeyword - 检查参考物品的任意装备栏位中是否装备了带有指定关键字的物品
- 是女性 - 检查参考人是否为女性
- 是孩子 - 检查引用是否为子元素
- 是玩家队友 - 检查裁判是否是该球员的队友。
- IsInInterior - 检查引用是否位于内部单元格中。
- IsInFaction - 检查引用是否属于指定阵营
- HasKeyword - 检查引用是否包含指定的关键字
- HasMagicEffect - 检查引用当前是否受到指定魔法效果的影响。可选择性地 仅检查活动状态 魔法效果
- HasMagicEffectWithKeyword - 检查引用当前是否受到具有指定关键字的魔法效果影响。(可选) 仅检查活动状态 魔法效果
- HasPerk - 检查引用是否具有指定的特权
- 拥有法术 - 检查裁判是否拥有指定的法术或呐喊。
- 比较值 - 比较两个值。这些值可以是静态值、全局变量引用、Actor 值或行为图变量。
- 等级 - 将角色的等级与指定值进行比较
- IsActorBase - 检查引用的角色基础形态是否为指定形态
- 种族 - 检查引用者的种族是否为指定的种族
- 当前天气 - 检查当前天气是否为指定的天气。可以是 TESWeather 类型或 BGSListForm 类型的天气列表。
- 当前游戏时间 - 将当前游戏时间与指定时间进行比较
- 随机的 - 将随机值与数值进行比较。可以指定生成的随机值的最小值和最大值。
- IsUnique - 检查引用是否被标记为唯一
- 类 - 检查引用的类是否为指定的类
- IsCombatStyle - 检查裁判的战斗风格是否为指定的战斗风格
- IsVoiceType - 检查裁判的语音类型是否为指定的语音类型
- IsAttacking - 检查裁判是否在进攻
- 正在运行 - 检查引用是否正在运行
- IsSneaking - 检查裁判是否在偷偷摸摸地执法
- 冲刺 - 检查裁判是否在冲刺
- IsInAir - 检查裁判是否在空中
- 正在战斗 - 检查裁判是否处于战斗状态
- 武器已拔出 - 检查裁判是否拔出了武器
- IsInLocation - 检查引用是否位于指定位置
- 具有引用类型 - 检查引用是否附加了指定的 LocRefType。
- IsParentCell - 检查引用当前是否位于指定的单元格中
- IsWorldSpace - 检查引用当前是否位于指定的世界空间中
- 阵营等级 - 将裁判的阵营等级与指定的等级进行比较
- IsMovementDirection - 检查引用是否沿指定方向移动
- IsEquippedShout - 检查裁判是否装备了指定的喊叫功能
- HasGraphVariable - 检查引用是否具有指定的图变量
- 潜水水平 - 将裁判的浸水深度(0-1)与数值进行比较
- IsReplacerEnabled - 检查是否存在已启用且名称与给定子模组名称相同的替换子模组。如果子模组名称留空,则检查替换模组中是否已启用任何子模组。
- IsCurrentPackage - 检查引用当前是否正在运行指定的软件包
- IsWornInSlotHasKeyword - 检查参考文献中指定槽位是否穿戴了带有指定关键字的物品
- 规模 - 将参考值的标度与数值进行比较
- 高度 - 将演员的身高与一个数值进行比较
- 重量 - 将演员的体重与一个数值进行比较
- 移动速度 - 将给定类型的裁判移动速度与数值进行比较
- 当前移动速度 - 将裁判当前的移动速度与一个数值进行比较
- 风速 - 将当前天气的风速与一个数值进行比较
- 风角差 - 将当前天气风向角与参考风向角之差与一个数值进行比较
- 犯罪黄金 - 将演员当前的犯罪金币与一个数值进行比较
添加于
1.1.0:
- 冰封 - 检查引用是否阻塞
- 战斗状态 - 检查裁判当前的战斗状态是否与给定状态匹配
- 库存盘点 - 将角色当前库存中指定形式的物品数量与一个数值进行比较
- 坠落距离 - 获取角色当前的下落距离并将其与一个数值进行比较
- 坠落伤害 - 计算角色此时落地所受到的坠落伤害,并将其与数值进行比较。
- 当前包过程类型 - 检查参与者的当前包过程是否为给定类型
- IsOnMount - 检查裁判是否骑在马上
- 骑行 - 检查引用是否骑乘指定的赛车形式
- IsRidingHasKeyword - 检查引用是否与具有指定关键字的表单关联
- 正在被骑 - 检查引用当前是否已被他人挂载
- 被骑 -检查引用是否当前已被指定的表单挂载
- Current Furniture - 检查参考编号当前是否占用指定的家具
- CurrentFurnitureHasKeyword - 检查引用当前是否占用具有指定关键字的家具
- HasTarget - 检查角色是否具有给定类型的目标
- 当前目标距离 - 测试角色当前目标与给定数值之间的距离
- 当前目标关系 - 根据数值检验行动者与其当前目标之间的关系
添加于
1.2.0:
- 装备物重量 - 将当前右手或左手中持有的物品的重量与一个数值进行比较。
- 当前铸造类型 - 检查给定角色来源中角色的当前角色类型是否为所需类型
- 当前交付类型 - 检查给定选角来源中演员的当前交付类型是否为所需类型
- IsQuestStageDone - 检查给定任务中的指定阶段是否已完成
- CurrentWeatherHasFlag - 检查当前天气是否启用了指定的标志。
- InventoryCountHasKeyword - 将角色当前库存中所有具有指定关键字的物品数量与一个数值进行比较
- 当前目标相对角度 - 测试演员与其当前目标之间的相对角度
- 当前目标视线 - 检查角色的当前目标是否在其视线范围内,或者角色是否在其当前目标的视线范围内。
- 当前旋转速度 - 将裁判当前的旋转速度与一个数值进行比较
- IsTalking - 检查裁判是在独白还是对话中发言。
- IsGreetingPlayer - 检查裁判是否在向球员致意
- IsInScene - 检查引用当前是否在场景中
- IsInSpecifiedScene - 检查引用当前是否位于指定的场景中
- 场景正在播放 检查特定场景是否正在播放
- 正在帮忙 - 检查裁判是否被球员要求做某事
添加于
1.3.0:
- 攻击状态 - 检查角色的攻击状态
- IsMenuOpen 检查特定菜单当前是否打开
- 目标 - 检查所有子条件是否都为真,但改为针对当前目标进行评估
- 玩家 - 检查所有子条件是否为真,但改为替玩家评估这些条件。
添加于
2.0.0:
- 光照强度 - 测试此参考点当前照明强度是否符合指定值
- LocationHasKeyword - 检查当前位置是否包含指定的关键字
添加于
2.1.0:
- 生命状态 - 检查演员的生命状态
- 坐睡状态 - 检查演员的坐姿/睡姿
- 自由的 - 检查子条件中是否只有一个为真(异或)
添加于
2.2.0:
- 预设 - 使用替换模组中定义的预设条件来代替此条件进行评估
- 山 - 检查所有子项条件是否为真,但评估的是挂载点的条件,而不是子项的条件。
- IsAttackTypeKeyword - 检查执行的攻击类型是否等于指定的关键字
- IsAttackTypeFlag - 检查执行的攻击是否启用了指定的标志。
- 运动表面角度 - 将裁判员行走的表面角度与数值进行比较
- 位置已清除 - 检查当前位置是否已清空
- IsSummoned - 检查引用是否为召唤生物
- IsEquippedHasEnchantment - 检查参考物品的左手或右手是否装备了带有指定附魔的物品
- IsEquippedHasEnchantmentWithKeyword - 检查参考物品的左手或右手是否装备了带有指定关键词附魔的物品
添加于
2.3.0:
- IsOnStairs - 检查裁判是否站在楼梯上。请注意,游戏中并非所有楼梯都标有“楼梯”字样。
- 表面材料 - 检查参考物所站立的表面是否具有指定的材质 ID
- 超负荷 - 检查引用是否占用过多资源
- 非法侵入 - 检查裁判是否擅闯禁区
- IsGuard - 检查裁判是否为后卫
- IsCrimeSearching - 检查参考文献是否正在搜索犯罪分子
- IsCombatSearching - 检查裁判是否正在战斗中搜索目标
- 空闲时间 - 将演员的空闲时间与一个数值进行比较
以下一些您可能从DAR中了解到的条件已被合并到新的条件中或重命名。基于DAR的替换模组仍能被正确读取。
- IsEquippedShout 🠚 IsEquippedPower (因为这就是它 实际上 (已在DAR中核实)
- IsEquippedRight, IsEquippedLeft 🠚 配备此外,还有一个布尔条件组件,用于表示左手
- IsEquippedRightType, IsEquippedLeftType 🠚 IsEquippedType此外,还有一个布尔条件组件,用于表示左手
- IsEquippedRightHasKeyword, IsEquippedLeftHasKeyword 🠚 IsEquippedHasKeyword此外,还有一个布尔条件组件,用于表示左手
- 值等于, 价值低于, IsActorValueEqualTo, IsActorValueLessThan, IsActorValueBaseEqualTo, IsActorValueBaseLessThan, IsActorValueMaxEqualTo, IsActorValueMaxLessThan, IsActorValuePercentageEqualTo, 演员值百分比小于 🠚 比较值
- 派系等级等于, IsFactionRankLessThan 🠚 阵营等级
- IsLevelLessThan 🠚 等级
- 当前游戏时间少于 🠚 当前游戏时间
使用你选择的模组管理器。
- 应该与任何非旧版的 Skyrim 版本兼容,包括 1.5.97、1.6+ 和 VR 版本。
- 不相容 使用动态动画替换器本身。
- 完全向下兼容 适用于任何为 Dynamic Animation Replacer 创建的动画替换模组。 它就是管用。.
- 合并映射器 包含技术支持。
该模组已由多人私下测试了相当长一段时间。然而,仍有可能存在一些遗漏的问题,尤其是在开发过程中,部分内部结构已被多次重构。报告任何错误时,请清晰描述,最好能提供重现步骤。如果出现崩溃,请提供崩溃日志。崩溃日志对于 SKSE 插件来说非常有用。
抱歉,不行。特别版的引擎更加稳定,而且像 CommonLibSSE 这样的框架可以更轻松地实现高级插件。
真的,真的 是时候继续前进了。不过,如果你不介意挑战,可以尝试将这个mod移植到LE版本。我宁愿把时间花在其他事情上,也不愿继续维护一个糟糕得多,而且现在看来也过时得离谱的游戏版本。
是的。
是的。该插件不会对您的游戏造成任何永久性影响,您可以随时安装/卸载。
不要删除插件创建的 .ini 文件(如果您使用的是 Mod Organizer 2,则默认情况下它会出现在覆盖文件夹中)。
请发布
.NET 脚本框架 /
崩溃日志记录器 崩溃日志。当崩溃确实是由像这样的 SKSE 插件引起的时,它非常有用。否则,没有更多信息我无法进行任何操作。
如果在主菜单崩溃,请尝试设置
bLoadDefaultBehaviorsInMainMenu = false 在 Data\SKSE\Plugins 目录下的 OpenAnimationReplacer.ini 文件中。(如果您使用 MO2 插件,则该文件位于 MO2 的覆盖文件夹中,因为它是在首次启动游戏并安装插件时生成的。)
检查完整文件路径是否超过 260 个字符,如果超过,请尝试通过更改文件夹名称或将游戏/模组管理器文件夹向上移动来缩短路径。这是某些 Windows 版本和/或模组管理器(?)的已知问题,似乎完全超出我的控制范围。
请阅读模组说明和
仔细探索游戏内的用户界面。.
我已经解释过了
基本布局 在“结构”部分。
杂项文件 包含一个
示例替换模组 您可以将其用作替换器的初始结构。
I
强烈不建议 尝试
手动编辑 .json 文件。直接使用游戏内置编辑器就行了。
将 DAR 模组移植到 OAR 时,您可以在游戏内编辑器中以作者模式保存原有子模组的配置文件。插件不会读取该文件,但您可以手动将其移动到新的、结构正确的文件夹中。这应该可以节省您重新创建条件的时间。不过,请考虑新的条件和/或功能,您或许可以简化或改进现有条件。
还有一个按钮可以让你将配置复制到剪贴板。
如果您的模组包含许多重复的动画(以便在不同的子模组中使用,并满足不同的条件),请考虑使用可选的子模组设置,该设置允许您覆盖动画文件夹。
考虑一下“
可中断子模组的设置——这个设置适用于任何需要特定条件的循环动画,因为当条件改变时,动画会立即被替换(例如,EVG Conditional Idles 的护盾闲置动画会在你卸下护盾时立即停止)。但是,不要在不需要此设置的子模组上启用它——它可能会造成性能损失(虽然不易察觉,但如果涉及多个角色和大量替换动画,损失可能会累积),因为此设置会导致在动画播放期间不断评估条件。
注意……
文件路径的字符限制 在 Windows 系统中,文件夹名称不要太长,否则如果 Skyrim 安装在较深的文件夹结构中,一些用户可能会遇到文件无法被 mod 管理器识别的问题。
文件夹名称要易于识别,但也要简短。 - 无论如何,完整的名称已经在 .json 文件中定义了。
有一个
论坛里的帖子 您可以在此处进行操作
建议新的条件请务必举例说明它们的应用场景,以便更容易理解。
如果您熟悉 True Directional Movement、TrueHUD 或 Precision API,那么您应该能轻松上手。目前,该 API 允许您的插件:
创建新的自定义条件.
我有一个
示例插件源代码 这里该 API 对很多东西进行了抽象,使创建新条件的过程尽可能简单,无需编写大量样板代码和引入不必要的依赖项。
想要了解更复杂、更真实的实际功能性病症示例,请查看以下内容:
数学插件及其
来源.
与我之前的 API 不同,这个 API 避免使用任何标准库类型(例如 std::function)。虽然使用标准库类型很方便,但很遗憾,它们无法保证与其他 DLL 的兼容性——我之前并没有意识到这一点。这使得它稍微笨重一些,但应该能够确保与那些并非使用同一编译器编译的插件兼容。
如果您想到任何可以添加到 API 的好方法,请告诉我。
GitHub示例插件 和
数学插件
感谢我的赞助人!❤️SKSE 团队,服务于 SKSE。
费利斯基 为了
动态动画替换器.
瑞安 对于无价的
CommonLibSSE.
三的力量 为了
CommonLibSSE 分支.
魅魔重子 为了
CommonLibSSE-NG.
meh321 用于地址库。
陆地 感谢你们在 VR 支持、许可和 GitHub 相关事宜上提供的帮助。
斯拉夫土豆 为了
沉浸式设备展示 我曾以此为例,演示如何使用 ImGui 实现游戏内 UI 的 SKSE 插件。
五肢猫 为了
猫中心这是另一个我发现很有用的 SKSE 插件示例,它使用 ImGui 实现了游戏内 UI。
吉拉蓬巴 感谢编辑提供的宝贵反馈和建议。
马克斯 感谢您提出DAR缺少的一些我之前不知道的实用功能。
那些一直敦促我开发开源 DAR 后继者的人。
感谢所有分享作品的《上古卷轴5:天际》逆向工程师,以及所有分享SKSE插件源代码的人。没有他们的贡献,我根本不可能学会这些。
所有测试过 WIP 版本的人,都经历了各种崩溃和奇怪的错误,并报告了这些问题。
睡眠守卫 模组描述中使用了该字体。