前提・実現したいこと
Unityでカードゲームを作ろうとしています。
現在、デッキエディット画面を作ろうとしています。
赤い矢印のところにマウスカーソルがあるときに、
画面の別のところに下の画像のようなカード情報を表示させたいと思っています。
どのようにすればマウス位置のオブジェクトの情報を取得できますか?
カードデータは下記のようにエクセルで管理しています。
]
2020/06/03追記
マウスオーバーの判定はできるようになったのですが、カード情報表示がうまくいかないです。
1枚目画像の赤矢印のオブジェクト、2枚目画像のカード情報表示はプレハブ化してあり、1枚目のはプログラムで生成、表示しています。
すでにキャンバス内にあるオブジェクトとカード情報表示オブジェクトなら表示はうまくいきそうなのですが、プレハブ化されているオブジェクトにキャンバス内のオブジェクトを割り当てることができないので表示ができないです。
あと、マウスオーバーしたオブジェクトの情報はどうすれば取得できますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア3302
0
色々やり方はあると思いますが、たとえばEventSystem
のIPointerEnterHandler
とIPointerExitHandler
でマウスオーバーとマウスが出たことを検知すれば作れそうです。
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
総合スコア3302
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/04 08:58
2020/06/04 10:09
2020/06/04 10:35