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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

2回答

1170閲覧

UnityでEventSystemを用いて他オブジェクトの関数を実行したい

Great

総合スコア22

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/08/04 16:59

実現したいこと

UnityでEventSystemを用いて他オブジェクトの関数を実行する。
独自ボタンを作り、ボタンを押したときに実行されるようにしたい。

試したこと

実行されてないようだったので試しにDebug.Logを入れてみるも何も表示されず。
OnPointerClickにあるDebugはしっかり表示された。

エラーが出ないため、自身では原因がわからず、困り果てたため質問します。

該当のソースコード

呼び出す方(ボタン側)のコード

C#

1using DG.Tweening; 2using UnityEngine; 3using UnityEngine.EventSystems; 4 5public class ButtonEndTurn : MonoBehaviour, 6 IPointerClickHandler, 7 IPointerDownHandler, 8 IPointerUpHandler 9{ 10 public System.Action onClickCallback; 11 12 public GameObject objButton; 13 public GameObject objSelectedCity; 14 public GameObject objTarget; 15 MakeCity city; 16 17 [SerializeField] private CanvasGroup _canvasGroup; 18 19 public void OnPointerClick(PointerEventData eventData) 20 { 21 onClickCallback?.Invoke(); 22 23 city = objSelectedCity.GetComponent<MakeCity>(); 24 ExecuteEvents.Execute<IEventCallerEndTurn>( 25 target: objTarget, 26 eventData: null, 27 functor: Method 28 ); 29 30 //Debug.Log(city.selectedList[0].pos[0]); 31 } 32 33 private void Method(IEventCallerEndTurn reciever, BaseEventData eventData){ 34 //reciever.ScoreTest(city.selectedList); 35 Debug.Log("@@@@@@@@@"); 36 } 37 38 public void OnPointerDown(PointerEventData eventData) 39 { 40 transform.DOScale(0.95f, 0.24f).SetEase(Ease.OutCubic); 41 _canvasGroup.DOFade(0.8f, 0.24f).SetEase(Ease.OutCubic); 42 } 43 44 public void OnPointerUp(PointerEventData eventData) 45 { 46 transform.DOScale(1f, 0.24f).SetEase(Ease.OutCubic); 47 _canvasGroup.DOFade(1f, 0.24f).SetEase(Ease.OutCubic); 48 } 49}

呼び出される方のコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6using TMPro; 7 8public interface IEventCallerEndTurn : IEventSystemHandler 9{ 10 void ScoreTest(List<MapInfo> city); 11} 12 13public class ScoreCheckerTest : MonoBehaviour, IEventCallerEndTurn 14{ 15 public TextMeshProUGUI score; 16 17 18 19 // Start is called before the first frame update 20 void Start() 21 { 22 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 29 } 30 31 public void ScoreTest(List<MapInfo> loaded){ 32 int countTest = 0; 33 foreach (MapInfo m in loaded){ 34 countTest++; 35 } 36 score.text = $"{countTest}"; 37 Debug.Log("*********"); 38 } 39}

補足情報

EDITER VERSION 2021.3.6f1

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

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

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

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

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

guest

回答2

0

ベストアンサー

検証しました。
ExecuteEventsの書き方に最初疑問を持ったんですが、同等の書き方をして問題無く動作していたので、問題無い書き方なのを確認しました。
そうなると、objTargetの中にScoreCheckerTest コンポーネントが含まれてないのでは?という疑念が沸いてくるのですが、その辺り大丈夫なのでしょうか?

投稿2022/08/05 01:45

編集2022/08/05 04:56
drednote

総合スコア336

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

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

drednote

2022/08/05 05:18 編集

ExecuteEventsの書いてあるコンポーネントのあるオブジェクトと別のオブジェクトにIEventSystemHandler継承インターフェイスを実装したコンポーネントを貼り付けて、 それでテストして正常動作を確認しました。
Great

2022/08/05 05:46

すみません オブジェクト指定を適切に行えていませんでした…
guest

0

複雑に捉えられているかもしれませんが、Buttonコンポーネントに頼らずButtonを実装するならUnityEventを作って各PointerDownなどのメソッド内で呼び出すように作ればButtonコンポーネントと同じことが出来ます。

cs

1using UnityEngine; 2using UnityEngine.EventSystems; 3using UnityEngine.Events; 4 5public class ExButton : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler 6{ 7 [SerializeField] 8 private UnityEvent OnPointerDownEvent; 9 10 [SerializeField] 11 private UnityEvent OnPointerUpEvent; 12 13 [SerializeField] 14 private UnityEvent OnPointerClickEvent; 15 16 public void OnPointerDown(PointerEventData eventData) 17 { 18 // ボタンが押される 19 OnPointerDownEvent.Invoke(); 20 } 21 public void OnPointerUp(PointerEventData eventData) 22 { 23 // ボタンが離される 24 OnPointerUpEvent.Invoke(); 25 } 26 public void OnPointerClick(PointerEventData eventData) 27 { 28 // ボタンが押され、その後ドラッグ操作が入ることなくボタンが離される 29 OnPointerClickEvent.Invoke(); 30 } 31}

投稿2022/08/05 00:23

Y0241-N

総合スコア1066

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問