GameManagerというGameObjectを作成しスクリプトであるtestScript.csをアタッチします。
Canvas配下にButtonを作成しそのしたの階層にtextを作成します。
ButtonのButton(Script)コンポーネント上のOn Click()でGameManagerオブジェクトを設定します。
そして、次の処理が書かれたFunctionを設定します。
Debug.Log(this.gameObject.name);
するとGameManagerがログとして出ます。
ですが、本当はここでButtonのオブジェクト名を取得したいです。
testScript.csにはどのように記述すればよいですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
下記のように、メソッドに引数を追加すると...
C#
1using UnityEngine; 2using UnityEngine.UI; 3using UnityEngine.EventSystems; 4 5public class TestScript : MonoBehaviour { 6 public void PrintSenderName(Button sender) 7 { 8 if (sender != null) 9 { 10 Debug.Log(sender.name); 11 } 12 } 13 14 // もしボタンが大量にあって、一つひとつPrintSenderNameの引数を設定していくのが大変なら、下記のように動的にアクションを追加するのも一つの手かと思います 15 /* 16 private void Start() 17 { 18 var buttons = FindObjectsOfType<Button>(); // すべてのボタンを探し... 19 20 foreach (var button in buttons) 21 { 22 var onClickEvent = button.onClick; 23 var persistentEventCount = onClickEvent.GetPersistentEventCount(); 24 25 for (var i = 0; i < persistentEventCount; i++) 26 { 27 // onClickに登録されているメソッド名とターゲットを調べ... 28 var methodName = onClickEvent.GetPersistentMethodName(i); 29 var target = onClickEvent.GetPersistentTarget(i); 30 31 if (methodName == "PrintSenderName" && target == this) // メソッド名が「PrintSenderName」、ターゲットがこのスクリプトなら... 32 { 33 onClickEvent.SetPersistentListenerState(i, UnityEngine.Events.UnityEventCallState.Off); // そのメソッドは無効化し... 34 onClickEvent.AddListener(() => 35 { 36 this.PrintSenderName(button); // 登録されていたメソッドの代わりに「このボタンを引数としてPrintSenderNameを実行する」アクションをあらためて登録する 37 }); 38 } 39 } 40 } 41 } 42 */ 43} 44
下図のように、インスペクタに引数設定欄が現れるかと思います。ここにそのボタン自身をセットしてやれば、メソッド実行時に引数としてそのボタンが渡ってくるはずです。
コード内にもコメントしましたが、一つひとつメソッド引数を設定するのが面倒でしたら、スクリプトからイベントハンドラーを追加することも可能ですので、そういった方法を検討してみてもいいかもしれません。
[追記]
ちょっと注意点を思い出しましたので念のため追記しますが、古いバージョンのUnityですと、コード中でコメントアウトした「多数のボタンに動的にアクション追加」をやると、どのボタンをクリックしても表示される名前が同じになってしまうかもしれません。
下記のように、button
をforeachブロック内の適当な変数に代入し直して、それをアクション内で参照するようにすれば多分旧バージョンでも対応可能かと思います...
C#
1 private void Start() 2 { 3 var buttons = FindObjectsOfType<Button>(); 4 5 foreach (var button in buttons) 6 { 7 var onClickEvent = button.onClick; 8 var persistentEventCount = onClickEvent.GetPersistentEventCount(); 9 10 for (var i = 0; i < persistentEventCount; i++) 11 { 12 var methodName = onClickEvent.GetPersistentMethodName(i); 13 var target = onClickEvent.GetPersistentTarget(i); 14 15 if (methodName == "PrintSenderName" && target == this) 16 { 17 var b = button; // buttonを別の変数にコピーし... 18 19 onClickEvent.SetPersistentListenerState(i, UnityEngine.Events.UnityEventCallState.Off); 20 onClickEvent.AddListener(() => 21 { 22 this.PrintSenderName(b); // buttonの代わりにbを使う 23 }); 24 } 25 } 26 } 27 }
投稿2018/01/13 23:26
編集2018/01/14 01:45総合スコア10807
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/14 04:18