2016-10-23 16 views
1

次のスクリプトでは、どのようにしてAssetsフォルダのスクリプトへのパスを取得できますか?ScriptableObjectのOnEnable関数が呼び出されていない

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); 
    } 
} 

問題は、それが呼び出されていないOnEnabled、またそれはスクリプトへのパスを取得する唯一の方法インスタンスが必要ですAssetDatabase.GetAssetPathているようだということです。

Unityのバージョンは5.5.0b3です。

答えて

1

ScriptableObjectを継承している間にOnEnable()関数を呼び出すには、クラスからCreateInstance()関数を呼び出す必要があります。

[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); 
    } 
} 

ScriptableObject.CreateInstanceを使用する別の方法は、別のスクリプトから呼び出すことです。

[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); 
    } 
} 

テスト

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

     if (myWindow == null) 
      myWindow = ScriptableObject.CreateInstance<MyWindow>(); 
    } 
} 
関連する問題