2016-10-23 4 views
1

Wie kann ich im folgenden Skript den Pfad zum Skript im Ordner Assets abrufen?OnEnable-Funktion von ScriptableObject wird nicht aufgerufen

using UnityEngine; 
using System.Reflection; 
using System.IO; 
using UnityEditor; 

[InitializeOnLoad] 
public class MyWindow : ScriptableObject 
{ 
    static string pathToScript; 

    [MenuItem("Window/My Window")] 
    static void Open() 
    { 
     // Do something with `pathToScript` 
    } 

    // This function is NOT called when the object is loaded. 
    protected void OnEnable() 
    { 
     var script = MonoScript.FromScriptableObject(this); 
     pathToScript = AssetDatabase.GetAssetPath(script); 
    } 
} 

Das Problem ist, dass OnEnabled es nicht genannt wird, es auch den einzigen Weg, scheint einen Pfad zu dem Skript ist durch AssetDatabase.GetAssetPath zu erhalten, die eine Instanz erfordert.

Die Version in Unity ist 5.5.0b3.

Antwort

1

Für die OnEnable() Funktion aufgerufen werden, während von ScriptableObject vererben, können Sie die CreateInstance() Funktion von ScriptableObject Klasse aufrufen müssen.

[InitializeOnLoad] 
public class MyWindow : ScriptableObject 
{ 
    static string pathToScript; 
    static MyWindow windowInstance; 

    [MenuItem("Window/My Window")] 
    static void Open() 
    { 
     Debug.Log("Open:" + pathToScript); 

     //Do something with `pathToScript` 

     if (windowInstance == null) 
      windowInstance = ScriptableObject.CreateInstance<MyWindow>(); 

    } 

    protected void OnEnable() 
    { 
     Debug.Log("Enabled!"); 
     var script = MonoScript.FromScriptableObject(this); 
     pathToScript = AssetDatabase.GetAssetPath(script); 
    } 
} 

Ein anderer Weg ScriptableObject.CreateInstance zu verwenden ist es von einem anderen Skript aufrufen.

[InitializeOnLoad] 
public class MyWindow : ScriptableObject 
{ 
    static string pathToScript; 

    [MenuItem("Window/My Window")] 
    static void Open() 
    { 
     Debug.Log("Open:" + pathToScript); 

     //Do something with `pathToScript` 
    } 

    protected void OnEnable() 
    { 
     Debug.Log("Enabled!"); 
     var script = MonoScript.FromScriptableObject(this); 
     pathToScript = AssetDatabase.GetAssetPath(script); 
    } 
} 

-Test:

public class Test : MonoBehaviour 
{ 
    public MyWindow myWindow; 
    public void OnEnable() 
    { 
     if (myWindow == null) 
      myWindow = Object.FindObjectOfType<MyWindow>(); 

     if (myWindow == null) 
      myWindow = ScriptableObject.CreateInstance<MyWindow>(); 
    } 
}