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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1975閲覧

Unityで複数のゲームオブジェクトからの入力を取得したいです。

7le2nniy

総合スコア6

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/05/21 21:44

編集2021/05/21 21:46

前提・実現したいこと

Unityで複数のゲームオブジェクトからクリックされた情報を取得したいです。
(どのゲームオブジェクトがクリックされたかの情報も欲しいです。)

クリック判定をしたいゲームオブジェクト用のクラスを用意して、
そのクラスを配列に入れています。

配列に入れたクラスのゲームオブジェクトにforeachで
・イベントトリガーコンポーネントを追加
・イベントトリガーにイベントを追加
をしています。

イメージ説明

発生している問題・エラーメッセージ

どのオブジェクトを押しても同じオブジェクトを2回押したことになってしまいます。
(画像の2個のキューブどちらを押しても「2番目のボタンが押されました。」が2回出力)

該当のソースコード

c#

TestButton.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

[System.Serializable]

public class TestObject
{
public GameObject gameObject;
public Image image;
public EventTrigger eventTrigger;
}

Test.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class Test : MonoBehaviour
{
//配列を宣言
public TestObject[] TestObjects = new TestObject[2];

private void Start() { //イベントトリガーに追加したいイベントを定義 EventTrigger.Entry entry = new EventTrigger.Entry(); //イベントの種類を指定 entry.eventID = EventTriggerType.PointerClick; int num = 0; //配列の繰り返し foreach (TestObject testObject in TestObjects) { //コンポーネントを追加 testObject.gameObject.AddComponent<EventTrigger>(); //コンポーネントを配列に追加 testObject.eventTrigger = testObject.gameObject.GetComponent<EventTrigger>(); //イベントで呼び出す関数を指定 entry.callback.AddListener((eventDate) => { ClickPiece(num); }); //イベントトリガーにイベントを追加 testObject.eventTrigger.triggers.Add(entry); num += 1; } } public void ClickPiece(int i) { Debug.Log(i + "番目のボタンが押されました。"); }

}

試したこと

下記サイトを参考に非永続的なリスナーをインスペクターで見れるようにしてみました。
https://baba-s.hatenablog.com/entry/2018/06/07/090000
イベントが2つ追加されてしまっているように思いますが解決策がわかりません。

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

Unity 2020.3.6f1

その他

わかりづらい説明で申し訳ありません。
また上記のやり方でなくとももっと良いやり方があれば教えて欲しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

2回表示されてしまうのは、2つのボタンが1つのEventTrigger.Entryを共有しているためかと思います。ボタン毎にそれぞれエントリーを作ってやってはいかがでしょうか。
次にどちらを押しても「2番目のボタンが押されました。」が表示されてしまうのは、numがループブロックの外側にある変数だからでしょうね(参考: コードインスペクション: 変更されたキャプチャー変数へのアクセス | ReSharper)。ループ内で新しい変数にnumをコピーし、ラムダ式にはそれをキャプチャーさせればよさそうです。

lang

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6public class Test : MonoBehaviour 7{ 8 //配列を宣言 9 public TestObject[] TestObjects = new TestObject[2]; 10 11 private void Start() 12 { 13 int num = 0; 14 15 //配列の繰り返し 16 foreach (TestObject testObject in TestObjects) 17 { 18 //イベントトリガーに追加したいイベントを定義 19 EventTrigger.Entry entry = new EventTrigger.Entry(); 20 21 //イベントの種類を指定 22 entry.eventID = EventTriggerType.PointerClick; 23 24 //コンポーネントを追加 25 testObject.gameObject.AddComponent<EventTrigger>(); 26 27 //コンポーネントを配列に追加 28 testObject.eventTrigger = testObject.gameObject.GetComponent<EventTrigger>(); 29 30 //foreach内で新たに変数を宣言し、numをそれにコピーして使う 31 int i = num; 32 33 //イベントで呼び出す関数を指定 34 entry.callback.AddListener((eventDate) => { ClickPiece(i); }); 35 36 //イベントトリガーにイベントを追加 37 testObject.eventTrigger.triggers.Add(entry); 38 39 num += 1; 40 } 41 } 42 43 public void ClickPiece(int i) 44 { 45 Debug.Log(i + "番目のボタンが押されました。"); 46 } 47}

投稿2021/05/22 00:34

Bongo

総合スコア10811

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

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

7le2nniy

2021/05/22 10:29

回答ありがとうございます。 やりたいことができました。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問