AddObjectPersistentListener の第3引数に、ボタンを押したときに渡されることになる引数を設定してやれということかと思います。
しかしどうやら他にも問題がありまして、調査不足で不確かですが、もしかするとクリック時に実行するメソッドをラムダ式として与えることはできないかもしれません。
ボタンに余計なコンポーネントを付けることになり不本意かもしれませんが、Editorフォルダ外に(Editorフォルダ内では実行時にスクリプトを使用できず不具合を起こすため)下記のようなスクリプトを別途用意して...
C#
1 using UnityEngine ;
2
3 public class ParentSetter : MonoBehaviour
4 {
5 public void OnClick ( Object target )
6 {
7 this . transform . SetParent ( target as Transform , false ) ;
8 }
9 }
SetUGUI_02
の方は下記のように変更してみました。
C#
1 using UnityEngine ;
2 using UnityEngine . Events ;
3 using UnityEngine . UI ;
4 using System . Collections ;
5 using System . Collections . Generic ;
6 using UnityEditor ;
7
8 public class SetUGUI_02 : EditorWindow //!< EditorWindowを継承してね!
9 {
10 //! MenuItem("メニュー名/項目名") のフォーマットで記載してね
11 [ MenuItem ( "Tools/SetUGUI_02" ) ]
12 static void ShowWindow ( )
13 {
14 // ウィンドウを表示!
15 EditorWindow . GetWindow < SetUGUI_02 > ( ) ;
16 }
17
18 GameObject Target_Obj = null ;
19
20 void OnGUI ( )
21 {
22 Target_Obj = ( GameObject ) EditorGUILayout . ObjectField ( "Target_Obj" , Target_Obj , typeof ( GameObject ) , true ) ;
23 if ( GUILayout . Button ( "SetEvents" , EditorStyles . miniButtonRight ) ) { Test ( ) ; }
24 }
25
26 void Test ( ) {
27 GameObject Select_Obj = Selection . activeGameObject ;
28 Button btn = Select_Obj . GetComponent < Button > ( ) ;
29
30 // 名無しのラムダ式ではなく、ボタンにスクリプトコンポーネントを追加して
31 // それの持つメソッドを実行させるようにする
32 ParentSetter listener = Select_Obj . GetComponent < ParentSetter > ( ) ;
33 if ( listener == null )
34 {
35 listener = Select_Obj . AddComponent < ParentSetter > ( ) ;
36 }
37 Transform targetTransform = Target_Obj == null ? null : Target_Obj . transform ;
38 UnityEditor . Events . UnityEventTools . AddObjectPersistentListener < Object > ( btn . onClick , listener . OnClick , targetTransform ) ;
39 btn . onClick . SetPersistentListenerState ( btn . onClick . GetPersistentEventCount ( ) - 1 , UnityEngine . Events . UnityEventCallState . RuntimeOnly ) ;
40 }
41 }
OnClick
の引数がTransform
ではなくObject
になっていますが、これはTarget_Obj
をNoneにすることもできるようにするための苦肉の策です。何かTransform
のままにするいい方法があるのかもしれませんが、見つけられませんでした...すみません。
Target_Obj
をNoneにすることは許さないというのでしたら(今回は対象がボタンですので、何かしらのCanvasの下に入れることにはなるでしょうから、parentをnullに...つまり親を持たないことを許さないというのはむしろ理にかなっているかもしれません)、下記のようにしてもいいと思います。
C#
1 using UnityEngine ;
2
3 public class ParentSetter : MonoBehaviour
4 {
5 public void OnClick ( Transform target )
6 {
7 this . transform . SetParent ( target , false ) ;
8 }
9 }
C#
1 using UnityEngine ;
2 using UnityEngine . Events ;
3 using UnityEngine . UI ;
4 using System . Collections ;
5 using System . Collections . Generic ;
6 using UnityEditor ;
7
8 public class SetUGUI_02 : EditorWindow //!< EditorWindowを継承してね!
9 {
10 //! MenuItem("メニュー名/項目名") のフォーマットで記載してね
11 [ MenuItem ( "Tools/SetUGUI_02" ) ]
12 static void ShowWindow ( )
13 {
14 // ウィンドウを表示!
15 EditorWindow . GetWindow < SetUGUI_02 > ( ) ;
16 }
17
18 GameObject Target_Obj = null ;
19
20 void OnGUI ( )
21 {
22 Target_Obj = ( GameObject ) EditorGUILayout . ObjectField ( "Target_Obj" , Target_Obj , typeof ( GameObject ) , true ) ;
23 if ( GUILayout . Button ( "SetEvents" , EditorStyles . miniButtonRight ) ) { Test ( ) ; }
24 }
25
26 void Test ( ) {
27 if ( Target_Obj == null )
28 {
29 Debug . LogError ( "Target_Obj must not be None!" ) ;
30 return ;
31 }
32
33 GameObject Select_Obj = Selection . activeGameObject ;
34 Button btn = Select_Obj . GetComponent < Button > ( ) ;
35
36 ParentSetter listener = Select_Obj . GetComponent < ParentSetter > ( ) ;
37 if ( listener == null )
38 {
39 listener = Select_Obj . AddComponent < ParentSetter > ( ) ;
40 }
41 UnityEditor . Events . UnityEventTools . AddObjectPersistentListener < Transform > ( btn . onClick , listener . OnClick , Target_Obj . transform ) ;
42 btn . onClick . SetPersistentListenerState ( btn . onClick . GetPersistentEventCount ( ) - 1 , UnityEngine . Events . UnityEventCallState . RuntimeOnly ) ;
43 }
44 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。