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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

Q&A

解決済

2回答

5062閲覧

Unityでマウスの位置にある物の情報を別の場所に表示したい

wata3

総合スコア16

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity

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

0グッド

0クリップ

投稿2020/05/27 12:04

編集2020/06/03 12:00

前提・実現したいこと

Unityでカードゲームを作ろうとしています。
現在、デッキエディット画面を作ろうとしています。
赤い矢印のところにマウスカーソルがあるときに、
イメージ説明
画面の別のところに下の画像のようなカード情報を表示させたいと思っています。
イメージ説明
どのようにすればマウス位置のオブジェクトの情報を取得できますか?
カードデータは下記のようにエクセルで管理しています。
イメージ説明]

2020/06/03追記
マウスオーバーの判定はできるようになったのですが、カード情報表示がうまくいかないです。
1枚目画像の赤矢印のオブジェクト、2枚目画像のカード情報表示はプレハブ化してあり、1枚目のはプログラムで生成、表示しています。
すでにキャンバス内にあるオブジェクトとカード情報表示オブジェクトなら表示はうまくいきそうなのですが、プレハブ化されているオブジェクトにキャンバス内のオブジェクトを割り当てることができないので表示ができないです。
あと、マウスオーバーしたオブジェクトの情報はどうすれば取得できますか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

追記だと分かりづらかったのでこっちに書きます。
スクリプトの情報が一切出てないので内部の構造がわからないのでほぼ推測なりますが
カードのマスターデータがあるなら一意のキーであるカードIDさえわかればどんな情報も引っ張ってこれるはずです。

なので、カードPrefabにカードIDを持つようにしておきます。次にマウスオーバーしたときにそのカードIDを伝えるようにします(eventやメソッド叩くのでもOK)、あとはその情報を受け取ってマスターからデータを引っ張って表示するスクリプトを用意すればよいかと思います。

今回はeventを使ったサンプルを出します。

(サンプル)カード

cs

1using UnityEngine; 2using UnityEngine.EventSystems; 3using System; 4 5public class Card : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { 6 7 public int cardID; 8 9 // これがevent 10 public event Action<int> OnPointerCard; 11 public event Action OnPointerExtisCard; 12 13 public void OnPointerEnter(PointerEventData eventData) { 14 OnPointerCard?.Invoke(cardID); // マウスオーバーしたのでカードIDを発火 15 } 16 17 public void OnPointerExit(PointerEventData eventData) { 18 OnPointerExtisCard?.Invoke(); 19 } 20}

cardIDというカードのIDを保持しています。また、eventを利用してマウスオーバーしたときにそのカードIDを発火します。

(サンプル)受け取り側(テキストボックスなど)

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Test : MonoBehaviour { 7 8 [SerializeField] Text textBox; // カード情報を表示するtextをアタッチ 9 10 // マスターデータ(とりあえず名前だけ) 11 Dictionary<int, string> cardDatas = new Dictionary<int, string>() { 12 { 0, "青の魔術師"}, 13 { 1, "黄色の剣士" }, 14 { 2, "赤の騎士" } 15 }; 16 17 18 // Start is called before the first frame update 19 void Start() { 20 21 // Prefab生成をするならこのへん 22 23 // 画面上にあるCardスクリプトを持つオブジェクトを取得 24 var allCardInScreen = FindObjectsOfType<Card>(); 25 26 // マウスオーバーイベントを購読 27 foreach(Card c in allCardInScreen) { 28 c.OnPointerCard += cardID => { 29 textBox.text = cardDatas[cardID]; 30 }; 31 32 c.OnPointerExtisCard += () => textBox.text = ""; 33 } 34 35 } 36 37 38} 39

受け取り側では、生成されたCardスクリプトをすべて取得してイベントを購読しています。
カードのイベントが発火したタイミングで、自身はこういう動きをするっていうのを設定するような感じですかね? 上記例だとカードIDでマスターデータから名前を表示しています。

イベントの購読さえしておけばあとは同じ動きなので、別にPrefabからどんどん生成しようが大丈夫です。少し内部をいじればドローしたカードも見れるようにするとかもできます

イメージ説明

投稿2020/06/04 01:10

hogefugapiyo

総合スコア3302

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

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

wata3

2020/06/04 08:58

foreach文を書いているときに、 CS1579 foreach ステートメントは、'CardID' が 'GetEnumerator' のパブリック インスタンス定義を含んでいないため、型 'CardID' の変数に対して使用できません。 とエラーが出てきました。CardIDはサンプルのCardのスプリクトとほぼ同じです。
hogefugapiyo

2020/06/04 10:09

そこまでいくと実際のスクリプトを見ないとちょっとわかりかねます。 他の方ならすぐわかる場合もあるので、一旦仕切り直しでスクリプトと画像をあわせて改めて質問しなおしてもらったほうが良いかと思います。
wata3

2020/06/04 10:35

なんかできました。すみません。
guest

0

色々やり方はあると思いますが、たとえばEventSystemIPointerEnterHandlerIPointerExitHandlerでマウスオーバーとマウスが出たことを検知すれば作れそうです。

EventSystemsがないと動かないので注意です

参考
https://gametukurikata.com/basic/mouseevent

イメージ説明

マウスを乗せたときに動かしたいオブジェクトにアタッチ(gif動画でいうと右3個のImage画像)

cs

1using UnityEngine; 2using UnityEngine.EventSystems; 3 4public class Card : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler { 5 6 public string name; 7 public string text; 8 9 public void OnPointerEnter(PointerEventData eventData) { 10 Debug.Log("カード名:" + name + "/ 説明: " + text); 11 } 12 13 public void OnPointerExit(PointerEventData eventData) { 14 Debug.Log("マウスが外れました"); 15 } 16}

これでマウスオーバーしたときにカード情報は取れるようになると思うので(csv化しているならカードIDだけもたせれば良いと思います)
あとは他のスクリプトなりでそれを受け取って説明文を表示するようにすれば良いのではないかと

投稿2020/05/28 08:12

hogefugapiyo

総合スコア3302

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

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

wata3

2020/06/03 12:03

Debug.Log表示はできましたが、情報表示がうまくいきませんでした。 追記したのですが、生成されたオブジェクトにはどう対処したらいいでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問