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

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

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

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

Unity

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

Q&A

2回答

1641閲覧

Listの中身に対応した画像を表示させたい

Astin

総合スコア14

C#

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

Unity

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

0グッド

0クリップ

投稿2018/06/21 03:03

現在記憶スロットの用なものをListで作っていて、フィールド上に存在する特定のオブジェクトを選んで記憶するとListに格納されていく という感じのものなんですが、現在そのListに入っているものをわかりやすくするために画面に記憶スロットに入っているオブジェクトに対応するImageを表示させたいな、と思っております。

最初は画面にそれぞれUIを配置してアクティブを切り替える方法でやっていたのですが、数が多くなると大変だと思ったのと、最初記憶できるのは一つだけで、強化アイテムを取得すると記憶できる個数が増え、(最大三つまで、3つとも画面に表示)一つ一つアクティブを切り替えていくのはわけがわからなくなってしまってしまったので断念しました…。

記憶スロットはこのように(↓)作っています。記憶できるオブジェクト二つなのに記憶スロットの上限3つもいらないじゃん と思われるかもしれませんが、後々増えていくので気が付かなかったことにしておいてください…。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5 6//記憶できるオブジェクトはここに追加 7public enum Gimmick 8{ 9 Empty = 0, //空っぽ 10 Box, 11 SignBoard, 12} 13 14 15/* 記憶スロット */ 16public class MemorySlot : MonoBehaviour 17{ 18 //最大スロット数 19 const int MaxSlotSize = 3; 20 21 //記憶スロット 22 List<Gimmick> m_Slot = new List<Gimmick>(); 23 24 //今選択中のスロットの番号 25 int m_CurrentSlectedIndex = 0; 26 27 //UI用 一つひとつインスペクターで設定してアクティブを切り替えるのはどうかと思う 28 public GameObject box_Image; 29 public GameObject signBoard_Image; 30 public GameObject box2_Image; 31 public GameObject signBoard2_Image; 32 public GameObject box3_Image; 33 public GameObject signBoard3_Image; 34 public GameObject lock_2; 35 public GameObject lock_3; 36 37 38 void Start() 39 { 40 //最初は空っぽ 41 m_Slot.Add(Gimmick.Empty); 42 43 //ほか二つは解放されていないのでロックされてるテクスチャを 44 lock_2.SetActive(true); 45 lock_3.SetActive(true); 46 47 } 48 49 //スロットを追加する 50 public void AddSlot() 51 { 52 //スロット数がすでにマックスだったらなんもしない 53 if (m_Slot.Count >= MaxSlotSize) return; 54 55 //空っぽのスロットを追加 56 m_Slot.Add(Gimmick.Empty); 57 if (m_Slot.Count == 2) 58 { 59 lock_2.SetActive(false); 60 } 61 else if (m_Slot.Count == 3) 62 { 63 lock_3.SetActive(false); 64 } 65 66 } 67 68 //ギミックをスロットに追加 69 public void SetGimmick(Gimmick gimmick) 70 { 71 m_Slot.Insert(0, gimmick); //先頭に追加 addだと末尾に追加されてしまう。 72 73 m_Slot.RemoveAt(m_Slot.Count - 1); //末尾の項目を消す こうすることで古いのが消えて新しいものが入っていく 74 } 75 76 //選択項目をずらす 77 public void ChangeSelected() 78 { 79 //Indexを+1した数をスロットの数で割る 80 //ボタンを押すと一つずれて一番上でボタンを押すと下に戻ってくる 81 m_CurrentSlectedIndex = (m_CurrentSlectedIndex + 1) % m_Slot.Count; 82 } 83 84 //現在選択されているGimmickを選択する 85 public Gimmick CurrentSelected 86 { 87 get 88 { 89 return m_Slot[m_CurrentSlectedIndex]; 90 } 91 } 92 93 //デバッグ用 94 /* public void DebugDump() 95 { 96 print("-------------"); 97 for (int i = 0; i < m_Slot.Count; i++) 98 { 99 print("[" + i + "] " + m_Slot[i]); 100 //print(m_Slot.Count); 101 } 102 print("-------------"); 103 } 104 */ 105} 106 107 108

文章がわかりにくく申し訳ないのですが、画面に3つのスロットすべて表示させる という仕様はあきらめたくないので質問しましたm(__)m

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

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

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

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

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

guest

回答2

0

まず、C#もUnityもやっていませんから、的外れなことを書くかもしれませんが。


私ならListに設定するやつをCやC++でいう構造体かクラスにしておきます。

C#

1// あくまでイメージ 2public class Slot{ 3 private int num_; // enumとかのセット 4 private String filename_; // 表示したいファイルパス 5 public Slot( int num, String filename ){ /* コンストラクタ */ } 6 public int num(){ /* int num_ 用のgetter */ } 7       public String filename(){ /* String filename_ 用のgetter */ } 8}

みたいにしておく。getter ( numメソッド, filenameメソッド ) は C#にはプロパティがあったはずなのでそれを使う。私はC#は使っていないから詳しくはわからんけど。

これをListを保持するところでは

C#

1List<Slot> slots; 2... 3slots.add( new Slot( 0, "box1.jpg" ) ); 4slots.add( new Slot( 1, "box2.jpg" ) ); 5...

みたいにする。

そうすれば、例えば paiter.paintメソッドがあるとして、それで描画するとしたら、

painter.paint( slots[1].filename() );

みたいにすればいいし。

投稿2018/06/21 04:36

BeatStar

総合スコア4958

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

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

0

仕様がいまいち分からず、的外れなアドバイスでしたら申し訳ないですが、
上記の回答者様がおっしゃっているようにオブジェクトのアクティブ非アクティブよりも画像の差し替えがスマートかと思います。
エディタ上のヒエラルキーとGameビューのスクショなどがあればよりわかりやすかったです。
また、今後色々増えてくることも考えられるので、引数で何番目のslotの情報を更新するかであったり、
取得したアイテムの個数を表示できるようにしたりしておくとより幅が広がるかも知れません。
なのでまずはslotに表示する情報を精査して表示情報用のクラスを1つ作ってしまうのが良いと思います。

だいぶはしょりますが、こんな感じで中見の画像を変更できるような仕組みを用意しておきます。
Resources.Loardの場合Atlasとか使う場合に少し面倒なのでそこはお任せします。

C#

1// 表示用画像のList(enumと連動するようにしておく) 2// Listを使わないのであればResourcesからLoadする 3[SerializeField]List<Image> imageList; 4[SerializeField]List<Image> slotList; 5 6void SetSlotImage(int slotIdx, int imageIdx) 7{ 8 slotList[Idx] = imageList[imageIdx]; 9} 10

投稿2018/06/22 19:54

wingriver283

総合スコア38

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問