Написание вызовов функций для функции в единой игре не работает - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь написать движок модов для игры.

Чтобы добиться этого, я решил добавить ссылку на мой движок dll в файл кода игры Unity Assembly-CSharp, а затем с помощью Mono.cecilя записал вызов движка в одну из функций, которые игра вызывает при загрузке.

Однако это (вызов функции) не работает, код выполняется как обычно, но мой движок не вызывается.Я также попытался сделать это с dnSpy, который также не работал.Я смог добавить туда код, который записывал бы в файл, если была вызвана функция, которая работала, так что либо что-то пошло не так с тем, как вызывается движок (или на него ссылаются), либо unity что-то делает, чтобы остановить это поведение.

Добавление ссылки с использованием mono.cecil:

private void AddRef(string path)
    {
        var _Module = ModuleDefinition.ReadModule(Path.Combine(Application.StartupPath, @"Assembly-CSharp.dll"));
        var nameReference = new AssemblyNameReference("ModEngine", new Version(1, 0, 0, 0));
        _Module.AssemblyReferences.Add(nameReference);
    }

Добавление вызова функции (возможно, не очень эффективный способ сделать это):

private void ReWrite()
    {
        var path = Path.Combine(Application.StartupPath, "Assembly-CSharp.dll"); //Get path to asm
        var assembly = AssemblyDefinition.ReadAssembly(path); //Load asm
        //Get types that match criteria
        var toInspect = assembly.MainModule.GetTypes().SelectMany(t => t.Methods.Select(m => new { t, m })).Where(x => x.m.HasBody);
        toInspect = toInspect.Where(x => x.t.Name.EndsWith("GlobalStats") && x.m.Name == "LoadStatData");
        foreach (var method in toInspect) //Get the type
        {
            var processor = method.m.Body.GetILProcessor(); //Get IL processor
            var call = processor.Create(OpCodes.Call, method.m.Module.Import(typeof(WeNeedToModDeeperEngine.ModEngine).GetMethod("Main"))); //Create a call opcode to the engine
            var lastInstruction = method.m.Body.Instructions[method.m.Body.Instructions.Count - 1]; //Get the last command

            processor.InsertBefore(lastInstruction, call); //Write the call before the first command

        }
        assembly.Write("Assembly-CSharp-patched.dll"); //Write the assembly
    }

Любые мыслио том, как заставить это (заставить вызывать движок мода) работать?

1 Ответ

0 голосов
/ 05 декабря 2018

Похоже, вы не можете связываться с файлом Assembly-CSharp из-за единства, вместо этого я использую UnityEngine.CoreModule.dll и внедряю в Display или Input

...