mercredi 18 mai 2016

C# Reflection Not Calling Methods

I am using Unity with reflection, and I am trying to call a certain method name Start, but my code is not calling it

Here is ModLoader.cs:

using UnityEngine;
using System.Collections;
using System.IO;
using System.Reflection;
using System.Collections.Generic;

public class ModLoader : MonoBehaviour {
    List<MethodInfo> modMethods = new List<MethodInfo>();

    // Use this for initialization
    void Start () {
        if (!Directory.Exists (Application.dataPath + "/../Mods")) {
            Directory.CreateDirectory (Application.dataPath + "/../Mods");
        }

        foreach (var mod in Directory.GetFiles(Application.dataPath + "/../Mods", "*.dll")) {
            var assembly = Assembly.LoadFile(mod);
            foreach (var type in assembly.GetTypes()) {
                foreach (var method in type.GetMethods()) {
                    modMethods.Add (method);
                }
            }
        }

        //Execute Start method in all mods
        foreach (MethodInfo method in modMethods) {
            print (method.Name);
            if (method.Name == "Start" && method.GetParameters().Length == 0 && method.IsStatic) {
                method.Invoke (null, new object[]{  });
            }
        }
    }

    // Update is called once per frame
    void Update () {
        //Execute Update method in all mods
        foreach (MethodInfo method in modMethods) {
            if (method.Name == "Update" && method.GetParameters().Length == 0 && method.IsStatic) {
                method.Invoke (null, new object[]{  });
            }
        }
    }
}

Here is my mod(a .dll):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

public class Class1 {
    static void Start () {
        Debug.Log("hello world");

        foreach (GameObject go in GameObject.FindObjectsOfType<GameObject>()) {
            if (go.GetComponent<MeshRenderer>()) {
                go.GetComponent<MeshRenderer>().material.color = new Color(1f, 0f, 0f);
            }
        }
    }
}

I have the dll from the build in the "Mods" folder, and I know that my script finds it, I just don't know why the method id not called.





Aucun commentaire:

Enregistrer un commentaire