Listの中身に対応した画像を表示させたい
受付中
回答 2
投稿
- 評価
- クリップ 0
- VIEW 303
現在記憶スロットの用なものをListで作っていて、フィールド上に存在する特定のオブジェクトを選んで記憶するとListに格納されていく という感じのものなんですが、現在そのListに入っているものをわかりやすくするために画面に記憶スロットに入っているオブジェクトに対応するImageを表示させたいな、と思っております。
最初は画面にそれぞれUIを配置してアクティブを切り替える方法でやっていたのですが、数が多くなると大変だと思ったのと、最初記憶できるのは一つだけで、強化アイテムを取得すると記憶できる個数が増え、(最大三つまで、3つとも画面に表示)一つ一つアクティブを切り替えていくのはわけがわからなくなってしまってしまったので断念しました…。
記憶スロットはこのように(↓)作っています。記憶できるオブジェクト二つなのに記憶スロットの上限3つもいらないじゃん と思われるかもしれませんが、後々増えていくので気が付かなかったことにしておいてください…。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//記憶できるオブジェクトはここに追加
public enum Gimmick
{
Empty = 0, //空っぽ
Box,
SignBoard,
}
/* 記憶スロット */
public class MemorySlot : MonoBehaviour
{
//最大スロット数
const int MaxSlotSize = 3;
//記憶スロット
List<Gimmick> m_Slot = new List<Gimmick>();
//今選択中のスロットの番号
int m_CurrentSlectedIndex = 0;
//UI用 一つひとつインスペクターで設定してアクティブを切り替えるのはどうかと思う
public GameObject box_Image;
public GameObject signBoard_Image;
public GameObject box2_Image;
public GameObject signBoard2_Image;
public GameObject box3_Image;
public GameObject signBoard3_Image;
public GameObject lock_2;
public GameObject lock_3;
void Start()
{
//最初は空っぽ
m_Slot.Add(Gimmick.Empty);
//ほか二つは解放されていないのでロックされてるテクスチャを
lock_2.SetActive(true);
lock_3.SetActive(true);
}
//スロットを追加する
public void AddSlot()
{
//スロット数がすでにマックスだったらなんもしない
if (m_Slot.Count >= MaxSlotSize) return;
//空っぽのスロットを追加
m_Slot.Add(Gimmick.Empty);
if (m_Slot.Count == 2)
{
lock_2.SetActive(false);
}
else if (m_Slot.Count == 3)
{
lock_3.SetActive(false);
}
}
//ギミックをスロットに追加
public void SetGimmick(Gimmick gimmick)
{
m_Slot.Insert(0, gimmick); //先頭に追加 addだと末尾に追加されてしまう。
m_Slot.RemoveAt(m_Slot.Count - 1); //末尾の項目を消す こうすることで古いのが消えて新しいものが入っていく
}
//選択項目をずらす
public void ChangeSelected()
{
//Indexを+1した数をスロットの数で割る
//ボタンを押すと一つずれて一番上でボタンを押すと下に戻ってくる
m_CurrentSlectedIndex = (m_CurrentSlectedIndex + 1) % m_Slot.Count;
}
//現在選択されているGimmickを選択する
public Gimmick CurrentSelected
{
get
{
return m_Slot[m_CurrentSlectedIndex];
}
}
//デバッグ用
/* public void DebugDump()
{
print("-------------");
for (int i = 0; i < m_Slot.Count; i++)
{
print("[" + i + "] " + m_Slot[i]);
//print(m_Slot.Count);
}
print("-------------");
}
*/
}
文章がわかりにくく申し訳ないのですが、画面に3つのスロットすべて表示させる という仕様はあきらめたくないので質問しましたm(__)m
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+2
まず、C#もUnityもやっていませんから、的外れなことを書くかもしれませんが。
私ならListに設定するやつをCやC++でいう構造体かクラスにしておきます。
// あくまでイメージ
public class Slot{
private int num_; // enumとかのセット
private String filename_; // 表示したいファイルパス
public Slot( int num, String filename ){ /* コンストラクタ */ }
public int num(){ /* int num_ 用のgetter */ }
public String filename(){ /* String filename_ 用のgetter */ }
}
みたいにしておく。getter ( numメソッド, filenameメソッド ) は C#にはプロパティがあったはずなのでそれを使う。私はC#は使っていないから詳しくはわからんけど。
これをListを保持するところでは
List<Slot> slots;
...
slots.add( new Slot( 0, "box1.jpg" ) );
slots.add( new Slot( 1, "box2.jpg" ) );
...
みたいにする。
そうすれば、例えば paiter.paintメソッドがあるとして、それで描画するとしたら、
painter.paint( slots[1].filename() );
みたいにすればいいし。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
仕様がいまいち分からず、的外れなアドバイスでしたら申し訳ないですが、
上記の回答者様がおっしゃっているようにオブジェクトのアクティブ非アクティブよりも画像の差し替えがスマートかと思います。
エディタ上のヒエラルキーとGameビューのスクショなどがあればよりわかりやすかったです。
また、今後色々増えてくることも考えられるので、引数で何番目のslotの情報を更新するかであったり、
取得したアイテムの個数を表示できるようにしたりしておくとより幅が広がるかも知れません。
なのでまずはslotに表示する情報を精査して表示情報用のクラスを1つ作ってしまうのが良いと思います。
だいぶはしょりますが、こんな感じで中見の画像を変更できるような仕組みを用意しておきます。
Resources.Loardの場合Atlasとか使う場合に少し面倒なのでそこはお任せします。
// 表示用画像のList(enumと連動するようにしておく)
// Listを使わないのであればResourcesからLoadする
[SerializeField]List<Image> imageList;
[SerializeField]List<Image> slotList;
void SetSlotImage(int slotIdx, int imageIdx)
{
slotList[Idx] = imageList[imageIdx];
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。