質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

4281閲覧

【Unity】【C#】EventTriggerにスクリプトからAddListerでメソッドを渡せない

Y0241-N

総合スコア1066

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/07/08 06:24

編集2020/07/08 06:53

発生している問題

表題通りです、スクリプトからオブジェクトにEventTriggerをAddComponentし、付与したEventTriggerにAddListenerでメソッドを登録したいのですが、できません。

確認したこととしては、処理は最後まで通っており、EventTypeの指定はできていますが、実行内容は登録されていませんでした。
EventSystemがScene上に存在していることも確認済みです、新規プロジェクトでもためしましたが、登録できなかった為プロジェクト固有の問題という訳でもないようです。エラーメッセージは発生していません。

Editor上でEventTriggerをAddし、手動でメソッドは指定できたので、メソッドにアクセスできていないわけではないようです。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5using UnityEngine.UI; 6 7public class TapIconToChangePanel : GetParentChilds 8{ 9 public GameObject[] Parents; 10 11 private string oldSelectIcon = default; 12 13 public override void GetChild() 14 { 15 Parent = Parents; 16 base.GetChild(); 17 } 18 19 void Awake() 20 { 21 GetChild(); 22 23 24 for(int x = 0; x < Panels.Count; x++) 25 { 26 for(int i = 0; i < Panels[x].Count; i++) 27 { 28 if(x == 0) 29 { 30 Panels[x][i].GetComponent<Image>().color = new Color(1, 1, 1, 0.4f); 31 32 EventTrigger currentTrigger = Panels[x][i].AddComponent<EventTrigger>(); 33 34 EventTrigger.Entry entry = new EventTrigger.Entry(); 35 entry.eventID = EventTriggerType.PointerDown; 36 entry.callback.AddListener( (date) => { CloseAndOpenPanel();} ); //ラムダ式の右側は追加するメソッドです。 37 currentTrigger.triggers.Add(entry); 38 } 39 40 if(x == 1) 41 Panels[x][i].SetActive(false); 42 } 43 } 44 Panels[0][1].GetComponent<Image>().color = new Color(1, 1, 1, 1); 45 Panels[0][1].SetActive(true); 46 } 47 48 void Update() 49 { 50 51 } 52 53 public void CloseAndOpenPanel() 54 { 55 if(oldSelectIcon == this.gameObject.name) 56 return; 57 58 oldSelectIcon = this.gameObject.name; 59 60 for(int x = 0; x < Panels.Count; x++) 61 { 62 for(int i = 0; i < Panels[x].Count; i++) 63 { 64 if(x == 0) 65 Panels[x][i].GetComponent<Image>().color = new Color(1, 1, 1, 0.4f); 66 67 if(x == 1) 68 { 69 if(Panels[x][i].name == oldSelectIcon) 70 Panels[x][i].SetActive(true); 71 else 72 Panels[x][i].SetActive(false); 73 74 } 75 } 76 } 77 this.gameObject.GetComponent<Image>().color = new Color(1, 1, 1, 1); 78 } 79} 80

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsuki01

2020/07/08 09:59

”登録できない”というのは、”メソッドが呼ばれない”とはまた別でしょうか。 以下参考URLの対応(リンク先の①の対応)で改善されたりしないでしょうか。 ※改善されなかったり、求めていることではなかったらスルーして頂いて大丈夫です。 https://learning-collection.com/unity3d%E3%80%80eventtrigger%E3%81%8C%E5%8F%8D%E5%BF%9C%E3%81%97%E3%81%AA%E3%81%84%E6%99%82%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95/
guest

回答2

0

実行内容は登録されていませんでした。

この「登録されていない」という状態について、何を見て、こういう状態だと思ったのに、それと違ってこういう状態だった、ということを明らかにしてください。なぜなら、「登録されていない」という問題について何を見てそう判断したのかがまったくわからないためです。

あとは、簡単なものから試してみた方がよいでしょう。質問をするにはコードに余計なものが多すぎます。例えばこの程度のものから試すとよいでしょう。

csharp

1using UnityEngine; 2using UnityEngine.EventSystems; 3 4[RequireComponent(typeof(RectTransform))] 5public class EventTriggerController : MonoBehaviour 6{ 7 void Start() 8 { 9 var trigger = gameObject.AddComponent<EventTrigger>(); 10 11 EventTrigger.Entry entry1 = new EventTrigger.Entry(); 12 entry1.eventID = EventTriggerType.PointerDown; 13 entry1.callback.AddListener(call => { Debug.Log("Pointer down."); }); 14 trigger.triggers.Add(entry1); 15 16 EventTrigger.Entry entry2 = new EventTrigger.Entry(); 17 entry2.eventID = EventTriggerType.PointerUp; 18 entry2.callback.AddListener(call => { Debug.Log("Pointer up."); }); 19 trigger.triggers.Add(entry2); 20 } 21}

投稿2020/07/08 13:08

bboydaisuke

総合スコア5291

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2020/07/09 02:42

失礼いたしました。 登録されていないと判断した要因はEditor再生中にInspectorからAddされたEventTriggerを確認した際に、「List is Empty」となっていた為、登録されていないと判断していました。 また、確認する用で異なるスクリプトを用意していたものの、空のメソッドを登録していた為、確認しようがない状態でありました。アドバイスありがとうございます。 既に結論は出たため、自己回答で要因と思い違いについて記載し、この質問をクローズさせていただきます。
guest

0

自己解決

まず、大きな思い違いをしていました。
手動でオブジェクトにEventTriggerをアタッチし、イベントを登録するとInspectorには元となるオブジェクトと実行するスクリプトとその中にあるメソッドが表示されます。
イメージ説明

しかし、スクリプトからEventTriggerに対し、イベントをAddListerで追加するとInspectorから登録されたイベント内容を確認することはできず、「List is Empty」の表示のままとなります。(AddListerで追加した場合は表示されないという情報はなかなか見つからず、偶然個人ブログの記事内で発見しました。この場を借りてお礼申し上げます)
イメージ説明
ですが、イベント自体は正しく登録されているため、メソッドの命令通りの処理を実行可能です。
私の場合、登録するメソッドの処理が実行されているか確認できないような処理であったため、このような勘違いが生まれました。bboydaisuke様が回答してくださったように、テストする際は必ず実行される内容を用いることがベストでしょう。

投稿2020/07/09 02:57

編集2020/07/09 02:57
Y0241-N

総合スコア1066

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問