質問するログイン新規登録
C#

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

Unity

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

Q&A

解決済

2回答

1511閲覧

switch式で、EventSystem.current.currentSelectedGameObjectを使うとNullになる

raincrow

総合スコア9

C#

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

Unity

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

0グッド

0クリップ

投稿2023/12/01 07:48

編集2023/12/01 08:06

0

0

実現したいこと

いつもお世話になっております。Unityでタイピングゲームを作っています。ボタン(OnPointerClick()で作成)を押したときに、別のスクリプトの関数を実行するのはできたのですが、その関数内のSwitch式が、いつもdefault値に行ってしまいます。気になって調べたら、EventSystem.current.currentSelectedGameObjectがnullでした。

該当のソースコード

c#

1public void StartProblem() { 2 ProblemSelectingManager psm = GameManager.Instance.problemSelectingPanel.GetComponent<ProblemSelectingManager>(); 3 4//この行のEventSystem.current.currentSelectedGameObjectがNull 5 bool a = EventSystem.current.currentSelectedGameObject switch 6 { 7 GameObject value when value == psm.HTMLPanelToggle => GameManager.Instance.Call(() =>{ 8 ProblemKind = GameManager.LANGUAGETYPE.HTML; 9 isMemorize = psm.HTMLPanelToggle.GetComponent<Toggle>().isOn; 10 Debug.Log(value); 11 return true; 12 }), 13 GameObject value when value == psm.CSSPanelToggle => GameManager.Instance.Call(() =>{ 14 ProblemKind = GameManager.LANGUAGETYPE.CSS; 15 isMemorize = psm.CSSPanelToggle.GetComponent<Toggle>().isOn; 16 Debug.Log(value); 17 return true; 18 }), 19 _ => GameManager.Instance.Call(() =>{ 20 ProblemKind = GameManager.LANGUAGETYPE.JS; 21 isMemorize = psm.JSPanelToggle.GetComponent<Toggle>().isOn; 22 Debug.Log(psm.HTMLPanelToggle); 23 Debug.Log(EventSystem.current.currentSelectedGameObject); 24 return true; 25 }) 26 }; 27 Debug.Log(a); 28 RefreshProblem(); 29 }

試したこと

関連する項目の検索
value when value == psm.HTMLPanelToggleをかっこで囲う
currentSelectedGameObjectをfirstSelectedGameObjectに置き換える
currentSelectedGameObjectをlastSelectedGameObjectに置き換える
UnityEventの順番を入れ替える
chatGPTに聞く
EventTriggerを追加する

補足情報(FW/ツールのバージョンなど)

unity version 2022.3.9f1
明確な情報ではなく、当てずっぽうでも構いません。不足な情報等あればお知らせください。
あと、UnityEventをUnityの標準のButtonのOnClickのように上下の順番を入れ替えられるようにするにはどうすればいいですかね?
良ければお教えください。英語で探しても見当たりませんでした。

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

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

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

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

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

guest

回答2

0

自己解決

馬鹿な質問でした。UIオブジェクトが押されているときにのみUnityEngine.EventSystems.EventSystem.currentSelectedGameObjectが反応するのに、自作のGameObjectのボタンで反応するはずありません。試しにButtonオブジェクトでやったら反応したので、まるでバカ丸出し、お尻丸出しですね。

投稿2023/12/04 03:52

raincrow

総合スコア9

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

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

0

[ChatGPT3.5]により生成された文章です。


まず初めに、EventSystem.current.currentSelectedGameObjectnullになる可能性がある場合、それに対処する必要があります。以下のように、null チェックを追加してみてください。

csharp

1public void StartProblem() { 2 ProblemSelectingManager psm = GameManager.Instance.problemSelectingPanel.GetComponent<ProblemSelectingManager>(); 3 4 GameObject selectedObject = EventSystem.current.currentSelectedGameObject; 5 6 bool a = selectedObject switch { 7 GameObject value when value == psm.HTMLPanelToggle => GameManager.Instance.Call(() => { 8 ProblemKind = GameManager.LANGUAGETYPE.HTML; 9 isMemorize = psm.HTMLPanelToggle.GetComponent<Toggle>().isOn; 10 Debug.Log(value); 11 return true; 12 }), 13 GameObject value when value == psm.CSSPanelToggle => GameManager.Instance.Call(() => { 14 ProblemKind = GameManager.LANGUAGETYPE.CSS; 15 isMemorize = psm.CSSPanelToggle.GetComponent<Toggle>().isOn; 16 Debug.Log(value); 17 return true; 18 }), 19 _ => GameManager.Instance.Call(() => { 20 ProblemKind = GameManager.LANGUAGETYPE.JS; 21 isMemorize = psm.JSPanelToggle.GetComponent<Toggle>().isOn; 22 Debug.Log(psm.HTMLPanelToggle); 23 Debug.Log(selectedObject); 24 return true; 25 }) 26 }; 27 28 Debug.Log(a); 29 RefreshProblem(); 30}

これにより、EventSystem.current.currentSelectedGameObjectnullの場合に、代わりにselectedObjectを使用するようになります。

また、UnityEventの順番を入れ替えるには、現在の Unity の標準の Button の OnClick のような順番変更機能は提供されていません。しかし、Unity 2022.3.9f1 の時点では EventTrigger を使用して、コードで動的にイベントを追加・削除することができます。順番を変更する場合は、対応するイベントをクリアしてから、新しい順番で再度登録する必要があります。

csharp

1using UnityEngine; 2using UnityEngine.EventSystems; 3using UnityEngine.UI; 4 5public class YourScript : MonoBehaviour 6{ 7 private Button yourButton; 8 9 private void Start() 10 { 11 yourButton = GetComponent<Button>(); 12 13 // 最初にイベントをクリア 14 yourButton.onClick.RemoveAllListeners(); 15 16 // 新しい順番でイベントを登録 17 yourButton.onClick.AddListener(YourFirstMethod); 18 yourButton.onClick.AddListener(YourSecondMethod); 19 } 20 21 private void YourFirstMethod() 22 { 23 // 何かの処理 24 } 25 26 private void YourSecondMethod() 27 { 28 // 別の処理 29 } 30}

上記の例では、Button コンポーネントを持つオブジェクトに対して、最初に登録されていたイベントをクリアしてから新しい順番で登録しています。この方法を使用して、イベントの順番を変更することができます。

投稿2023/12/02 13:25

編集2023/12/02 13:36
kosetei

総合スコア64

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

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

raincrow

2023/12/04 01:31

コメントありがとうございます! そうですか……。UnityEventは入れ替えられないですか……。 というかこの生成、nulチェックを行うといいながら、行ってないですね……。 一応試してみたのですが、nullのままでした。 とはいえ、こういう投稿が何かの気付きになるかもしれません。 このまま何回でも繰り返してもらっても嬉しいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問