Skip to content

验证环境

本页内容已按 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 判断 = 随机崩溃 ---