验证环境
本页内容已按 Build 740622 对应的本机 Managed DLL 和项目配置检查;尚未在游戏内完成运行验证。
C# 核心语法
这不是一篇“C# 入门”,而是 专门为《缺氧(ONI)》Mod 开发提炼的最小语法集。
阅读目标:
- 能直接看懂 ONI 源码 > * 能独立写 Harmony Patch > * 知道哪些语法是“必须会”,哪些可以先无视
总览
ONI Mod 的 C# 本质只有四件事: > 1⃣ 类 + 组件 2⃣ static + ref 3⃣ 数组 + 泛型 4⃣ null 判断
下面所有内容,都是在为这四点服务。
一、class 是一切的起点
你在 ONI 里只会写这三种类
csharp
public class XXXConfig : IBuildingConfig {}
public class XXXPatch {}
public class XXXComponent : KMonoBehaviour {}结论:
- 类必须是
public* 不要纠结面向对象
二、static:为什么 Patch 必须是 static
普通方法(ONI 几乎不用)
csharp
public void DoSomething() {}Patch 方法的常见写法
csharp
public static void Postfix() {}原因一句话解释:
常见情况下,Harmony 直接调用静态补丁方法;因此示例统一使用
static。
补丁方法的参数和返回值仍需与目标方法的注入规则匹配。
三、ref:何时需要按引用传递
修改引用类型对象的属性
csharp
public static void Postfix(BuildingDef __result)
{
__result.EnergyConsumptionWhenActive = 1f;
}BuildingDef 是引用类型。只修改对象属性时,不需要 ref。
替换返回值引用
csharp
public static void Postfix(ref int __result)
{
__result += 1;
}只有要替换整个返回值,或目标参数本身是值类型并需要写回时,才需要 ref。上例用 int 展示值类型写回;对于原方法返回值,Harmony 使用 __result 注入,具体是否加 ref 取决于你是修改对象还是替换引用。
四、组件思维:ONI ≈ Unity
所有功能 = 组件
csharp
go.AddOrGet<ElementConverter>();
go.AddOrGet<Operational>();AddOrGet 的真实含义
text
有 → 拿
无 → 加❗ ONI 世界里
- 没有组件 = 没有功能 ---
五、泛型 <T>:不要怕,它只是“占位”
看到下面这两行,直接翻译成中文
csharp
go.AddOrGet<ElementConverter>();
go.GetComponent<KPrefabID>();翻译:
“我要 ElementConverter 这个组件”
<T>= 类型占位符,仅此而已
六、null 判断:ONI Mod 的生命线
正确写法
csharp
var converter = go.GetComponent<ElementConverter>();
if (converter == null)
return;原因一句话:
Patch 执行顺序不固定,组件不一定存在。
👉 不写 null 判断 = 随机崩溃 ---