実現したいこと
画像Aを押している間だけ、別の画像Bを大きく表示させる、という事を
「Event Trigger」の PointerDown と PointerUp を使って実現できたのですが
画像Aも画像Bも、両方ともがヒエラルキー上に最初から存在する場合、は簡単でした。
画像Aが最初から存在しているので[SerializeField] で押している間に表示させたい画像Bを予め選んでおけるからです。
これが画像Aが「prefab」後から生成される画像で
最初はヒエラルキー上に存在しない場合、途端にどうすれば良いのかがもうわからないのです。
少しでも簡単になればと思って画像Bに関してはヒエラルキー上に用意してSetActive(false);で待機させてあります。
※画像Bも本来は「prefab」後から生成される画像だったけど画像Aも画像Bも
両方ともが「prefab」で生成されるとなるともう本当にわけがわからなくなるので・・・
発生している問題・分からないこと
「prefab」については本当に悩みの種で、いつも「prefab」が出てくるだけでヒエラルキー上にある物だったら出来ていた事が途端に出来なくなってしまいます。
ちなみに先に質問した内容の続きになっています
https://teratail.com/questions/twk0oiyg3lztpx#reply-rnuh8uqb2imsm8
アイテムスロットの枠に画像が表示されるようになった、所まではおかげ様で出来たのですが
そのスロットに表示されているアイテムの画像を押している間、別の画像が大きく表示される、といった事がやりたい事です
該当のソースコード
最初からヒエラルキー上に画像が有る場合はこれを画像に貼って 「Event Trigger」の PointerDown と PointerUp で設定するだけなので簡単でした public class clickOnAction : MonoBehaviour { [SerializeField] GameObject GatyaImageBig; //←画像を押している間だけ表示させたい画像を先に選択しておけるので簡単 public void PointerDown() { GatyaImageBig.SetActive(true); } public void PointerUp() { GatyaImageBig.SetActive(false); } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
この数週間で完全に「prefab」に苦手意識を持ってしまいました。
これが出てくるだけで数時間、時には数十時間、何も進まない、という体験を連続で食らってしまっています。
「prefab」だと [SerializeField] が全部外れてしまうのは色々な解説を読んで理由もわかりましたが、結果、とても使いにくくてわかりにくくて便利ではないです。
補足
Itemの情報として
[Serializable]
public class Item
{
public enum Type
{
A_Item,
B_Item,
C_Item,
D_Item,
E_Item,
F_Item,
G_Item,
H_Item,
}
public Type type; //種類
public Sprite sprite; //アイテムスロットに表示する画像 これは正しく表示出来ている
public Sprite BigSprite; //大きく出す画像
}
種類、スロットに表示する画像(これは正しくアイテムスロットに表示が出来ている)
そして public Sprite BigSprite; //スロットの画像を押した際に大きく出したい画像
と↑の3つの情報があって設定が出来ているのですが
先の質問で
https://teratail.com/questions/twk0oiyg3lztpx#reply-rnuh8uqb2imsm8
image = GetComponentsInChildren<Image>().Where(c => gameObject != c.gameObject).Single();
と書いて子オブジェクトを指定する方法を教えてもらって
子オブジェクトからスロットの画像を取得できて、アイテムスロットに画像を入れれたものの
コードの意味が何も分かっていないままコピーしただけなのでなぜこれで
子オブジェクトの画像が入れれているのかわかっていません、つまり
public Sprite BigSprite;の中に入っている「スロットの画像を押した際に大きく出したい画像」も
もちろん指定できない、という状態です
public Type type;(種類)も取得する方法がわかっていないです
これがわかればこのtypeの場合、画像を押したらこの画像をこの部分に大きく表示、といったような
条件式も書けると思うのですが
ここまでわかっていなくて今、アイテムスロットに画像が表示されてるはどうしてなのか、自分でも不思議です
先の質問での
https://teratail.com/questions/twk0oiyg3lztpx#reply-rnuh8uqb2imsm8
コードを何度も見直していて気付いた事が有って
private void Awake()
{
image = GetComponentsInChildren<Image>().Where(c => gameObject != c.gameObject).Single(); //こう書くことで子の画像を指定できている、コードの意味はわからない
}
public void SetItem(Item item)
{
this.item = item;
UpdateImage(item); //←今まではこれしか無かった、画像しか更新されていなかった
UpdateType(item); //←なのでこれを追加してtypeを更新すれば区別できるのでは??
}
void UpdateImage(Item item) //これは先の質問の時にも有った関数、slotの画像情報を書き換え
{
image.sprite = item.sprite; //Slotのimageにアイテムのspriteを入れる
}
//public Item.Type ItemType; アイテム用の変数を宣言しておいて
void UpdateType(Item item) //タイプを書き換える関数が無かったので追加してみた
{
ItemType = item.type; //これでSlotのTypeにアイテムのTypeが入った。。。のではないか?
}
画像は void UpdateImage(Item item) を使って書き換えることが出来ているので
それと同じタイミングでtypeの情報を書き換えれば、と思い試してみたところ、
これでタイプ情報が入っているようです。
大きな画像もこれと同じ要領で書き換えればついに目的達成できる・・・??
↑Typeが書き換えれてスロットに情報としてちゃんと入っています・・・
(画像の C_charm4 というのが4時間もかけてようやく入れる事の出来たItemType
アイテムが違うとこの部分もちゃんと変わるようになってくれた)
・・・が、しかしその画像を押した時、そのスロットに設定されている
タイプが A_Item,ならこの画像を表示、B_Item,ならこの画像を表示、
という事が出来ると思っていたのですが今度はその条件式の書き方がわからないです。。。
public void PointerDown()
{ Debug.Log("画像が押されてます");
switch (ItemType)
{
case Item.Type.A_Item: //アイテムタイプがA_Item の時
ItemImage01Big.SetActive(true); //アイテムAの拡大画像を表示
break;
case Item.Type.B_Item: //アイテムタイプがB_Item の時
ItemImage02Big.SetActive(true); //アイテムBの拡大画像を表示
break;
}
}
これでスロットに入っている画像のタイプを見てくれて条件式分けが出来ると思っていたのですが
この書き方では押した画像のスロットのタイプを全く参照してないようでどっちのcaseも通らないようです
※switchの外に書いた Debug.Log("画像が押されてます"); は動いているのでcaseの中だけ通ってない
押した画像のItemTypeを参照させてそれを条件式に書く場合はどのよう書けば良いのでしょうか

回答1件
あなたの回答
tips
プレビュー