验证环境
本页内容已按 Build 740622 对应的本机 Managed DLL 和项目配置检查;尚未在游戏内完成运行验证。
C# 开发基础(ONI Mod 专用)
在编写《缺氧(Oxygen Not Included, ONI)》Mod 代码之前,你需要掌握一些 C# 的核心概念。本篇内容将专门围绕 ONI Mod 开发中最常见、最实用的语法与结构展开。
一、命名空间与类(Namespace & Class)
《缺氧》的源码规模非常庞大,因此大量使用 命名空间(namespace) 来对功能进行划分。你的 Mod 代码也应当遵循这一习惯,以避免冲突、提升可维护性。
开始
建议
如果还不了解 namespace、class 和 method,建议先花一点时间补充 C# 基础,再继续阅读本篇。
二、HarmonyPatch:精准定位游戏源码
在《缺氧》Mod 开发中,[HarmonyPatch] 属性(Attribute)用于指定要补丁的类型和方法。目标方法存在重载时,还需要提供参数类型。
1. 核心语法:三种定位方式
根据目标方法的复杂程度,你通常会用到以下三种写法:
| 定位类型 | 代码示例 (Attribute) | 适用场景 |
|---|---|---|
| 基础定位 | [HarmonyPatch(typeof(Db), "Initialize")] | 最常用。目标类中只有一个同名方法时使用。 |
| 重载定位 | [HarmonyPatch(typeof(Assets), "GetSprite", new Type[] { typeof(HashedString) })] | 当方法有多个重载(名字相同但参数不同)时,必须指定参数类型。 |
| 属性定位 | [HarmonyPatch(typeof(BuildingDef), "IsSolid", MethodType.Getter)] | 专门用于拦截 C# 的 属性 (Property)。需指定是修改 Getter 还是 Setter。 |
2. 实战:如何从 dnSpy 提取 Patch 信息?
当你使用 dnSpy 查看游戏源码 Assembly-CSharp.dll 时,请按照以下逻辑进行拆解:
- 类名 (Class):看代码最顶层的
public class后面跟着的单词。- 源码:
public class GeneratedBuildings - 对应参数:
typeof(GeneratedBuildings)* 方法名 (Method):看括号左边的那个单词。 - 源码:
public static void LoadGeneratedBuildings(...) - 对应参数:
"LoadGeneratedBuildings"* 参数类型 (Parameters):看括号里面的内容,如果是重载方法则需要提取。 - 源码:
(ICollection<Type> types) - 对应参数:
new Type[] { typeof(ICollection<Type>) }---
- 源码:
3. 标准代码结构模板
csharp
using HarmonyLib; // 必须引用 Harmony 库
using UnityEngine; // 如果用到 Debug.Log 或 GameObject
namespace MyOniMod
{
// 1. 定位:我们要改哪个类的哪个方法?
[HarmonyPatch(typeof(EntityConfigManager), "LoadGeneratedEntities")]
public class MyEntityPatch
{
// 2. 注入:在原方法执行后(Postfix)做点什么?
public static void Postfix()
{
// 你的逻辑代码
Debug.Log("ONI Mod: 游戏实体加载完成!");
}
}
}