2016-05-18 15 views
2

Ich bin mit Unity mit Reflexion, und ich versuche, eine bestimmte Methodennamen beginnen zu nennen, aber mein Code ist es nichtC# Reflection Nicht Methoden aufrufen

Hier Aufruf ist 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[]{ }); 
      } 
     } 
    } 
} 

Hier ist mein 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); 
      } 
     } 
    } 
} 

ich die dLL aus dem Build in dem „Mods“ -Ordner, und ich weiß, dass mein Skript findet es, ich weiß nur nicht, warum das Verfahren ID nicht angerufen.

+1

Haben Sie durch es im Debugger trat, um zu sehen, was passiert, wenn die 'foreach' Aufruf der Methoden erreicht Sie anrufen möchten? –

+0

Die Methode übergibt die if-Anweisung nicht, und ich denke, das liegt am Namen der Methode. Warum nimmt er den Namen nicht an? –

Antwort

2

Die Startmethode in Ihrem Modul ist privat. Reflection arbeitet standardmäßig mit öffentlichen Methoden. Sie müssen es öffentlich machen:

public class Class1 { 
    public 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); 
      } 
     } 
    } 
} 

oder BindingFlags für die GetMethods Methode angeben. Sie müssen BindingFlags.Static und BindingFlags.NonPublic

type.GetMethods(System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic) 
+0

Vielen Dank für Ihre Antwort! –

0

In Abwesenheit eines public Schlüsselwortes auf Ihrer Start Methode wird es nicht öffentlich sein, und GetMethods() sucht standardmäßig nur nach öffentlichen Methoden.

Entweder Start öffentlich machen oder type.GetMethods() zu type.GetMethods(BindingFlags.NonPublic | BindingFlags.Static) ändern.

Verwandte Themen