个人建议看这篇专栏,讲得更好
https://blog.csdn.net/Terry13143/article/details/153626365
0 准备
准备好下载以下软件:
- Unity引擎
- BepInEx 教程 https://blog.csdn.net/qq_25775935/article/details/152817208
- Visual Studio(选择.NET桌面开发和使用Unity的游戏开发) P.S. 在选择使用Unity的游戏开发时不要勾选Unity Hub,因为VS自带的Hub版本太低
- 反编译工具,如dnSpy,ILSpy等等
- 解包游戏资源工具,如AssetRipper.GUI.Free.exe 等等
1 游戏对象信息
1.1Unity版本
打开游戏目录,找到其中的UnityPlayer.dll,将光标停留在上面就会显示版本号。
1.2 Mod框架
Unity打包的时候会有两种选择,分别为Mono和IL2CPP。其中Mono反编译可直接看到代码,而IL2CPP不行。如果在游戏目录中看到GameAssembly.dll就是IL2CPP。
1.3 .NET框架
打开游戏文件目录,打开<Game Name>_data/Managed,如果发现有netstand.dll就为net472
如果mscorlib.dll的版本大于4就选择net46,其他所有情况都选择net35.
2 创建一个hello world mod
首先打开VS,创建一个C#的.NET Framework类库。框架使用1.3中得到的框架。创建好项目后先在解决方案资源管理器中右键引用,选择添加引用。

其中游戏data:
"Assembly-CSharp.dll","UnityEngine.dll"
// 可选复制文件
"UnityEngine.CoreModule.dll","UnityEngine.UI.dll"
BepInEx:
"0Harmony.dll","BepInEx.dll","BepInEx.Harmony.dll"
输入:
void Update()
{
if(Input.GetKeyDown(keyCode.f12))//检测输入
{
}
}
//引用使用UnityEngineLegacyModule.dll
这里讲一下awake(),start()与update():
awake():
Awake() 是 Unity 游戏引擎中的一个特殊方法,属于 MonoBehaviour 类。它在脚本实例被加载时自动调用,无论脚本是否启用。Awake() 通常用于初始化变量、设置引用或执行其他需要在游戏开始前完成的准备工作。
使用 Awake() 的场景
Awake() 适合用于初始化不依赖于其他对象的变量或组件。例如,设置本地变量、获取附加到同一游戏对象的组件引用,或执行不需要等待其他脚本初始化的操作。由于 Awake() 在脚本禁用时也会调用,它适合执行那些即使脚本被禁用也需要完成的工作。
using UnityEngine; public class ExampleScript : MonoBehaviour { private Rigidbody rb; void Awake() { rb = GetComponent<Rigidbody>(); Debug.Log("Awake called"); } void Start() { Debug.Log("Start called"); } }
start():
Start()方法在脚本实例初始化后仅调用一次,通常用于初始化变量、设置初始状态或执行只需运行一次的代码。它的调用时机是在所有Awake()方法执行完毕之后,但在第一次Update()之前。Awake() 和 Start() 都是 Unity 的初始化方法,但它们在调用时机上有区别。Awake() 在脚本加载时立即调用,而 Start() 在脚本启用后、第一帧更新之前调用。
void Start() { // 初始化游戏对象或变量 Debug.Log("Start 方法被调用"); }
update():
Update()方法在每一帧渲染前都会被调用,通常用于处理实时逻辑,如玩家输入、物理模拟或游戏状态更新。它的调用频率取决于游戏的帧率(FPS)。void Update() { // 每帧执行的逻辑 Debug.Log("Update 方法被调用"); }因为
Update()每帧执行一次,所以Update()中的代码应尽量高效,避免复杂计算,否则可能影响游戏性能。

394

被折叠的 条评论
为什么被折叠?



