見出し画像

Unity-画像リストの作成備忘録-

やりたいこと

間違い探しのゲームを開発中。
UIのスクロールに画像を並べて、画像をクリックすることでその画像の間違い探しを遊ばせたい。

今回の実装

運用コストを下げるため、特定のフォルダに画像をいれると自動でリストに画像が追加される。
画像には当たり判定があって、タップすると画像の名前を取得しゲームシーンへ遷移。
ゲームシーンでは取得した画像の名前と同じ間違い探しprefabを配置。
選択した画像の間違い探しが遊べる。

特定のフォルダにある画像をUIのスクロールに並べる

まずは完成画像から。Resources/illustにあるイラストは現在4枚ですが、
これが何枚増えてもUI_Canvas>Scroll View>Viewport>Contentsの子に並びます。(画像はモザイクで…)

まずは画像の入れ物になるprefabを準備しました。


並べる画像と同じWidchとHightに念のためしてあります。
Layoutgroupでも調整されるのであんまり意味はない……

またLayoutManagerという空のGameObjectを作成し、こちらに同名のスクリプトをアタッチしました。LayoutManagerの中身はこんな感じ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class LayoutManager : MonoBehaviour
{
    //取得したイラストをリスト型で管理
    Sprite[] illusts;
    
    //このTransformの子にイラストを並べたい
    public Transform Content;

    //先ほど作成したprefabを設定
    public GameObject illustImage;


    // Start is called before the first frame update
    void Start()
    {
        //Resourcesフォルダのイラストを取得
        illusts = Resources.LoadAll<Sprite>("Illust");

        //イラスト枚数分処理を繰り返し
        foreach (var t in illusts)
        {    
            //illustPrefab生成
            GameObject illustPrefab = Instantiate(illustImage);
            
            //Imageコンポーネント取得
            Image im = illustPrefab.GetComponent<Image>();
            
            //イメージにイラスト代入
            im.sprite = t;

            //prefabをスクロールに追加
            illustPrefab.transform.SetParent(Content, false);
           
        }
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

publicで宣言した変数にInspectorでobjectとtransform代入しました。


これで再生すると画像がスクロールに並ぶはずです。

Resourcesフォルダについて

すこしググるとResourcesフォルダは使わないほうがいい…との記事がよくでてくるのですが今回はあまり時間がないこともありスピード重視で実装しました。
果たして使わないほうがいいのか……ちょっと後ほどゆっくり勉強したいと思います。

つまずいたところ

はじめて自分でしっかりスクリプトを書いているのですべてがつまずいたところといえます。。
まず序盤の

public Transform Content;

こちらのちにsetparentで使うために用意しているのですが、
最初はGameObject型で宣言しておりました。transformのsetparentを使いたいなら型が違うぞ!!とすごい怒られました。。

 error CS1503: Argument 1: cannot convert from 'UnityEngine.GameObject' to 'UnityEngine.Transform'
public GameObject Content;

illusts = Resources.LoadAll<Sprite>("Illust");
こちらのフォルダを参照するのにもまた時間がかかりました。
prefabを参照などはよく見かけたのですが、画像となると…といった感じでまだまだ応用が効かず。
そして取得したイラストを並べる部分でも型違いが……

Sprite[] illusts;

ここも最初

Object[] illusts;

と書いていたせいで下でいくらspriteに取得した画像をいれようとしてもエラーがでてまったく進みませんでした。
今どの型を扱ってるのか、Debug.Logで出力して確認して沼りましたがなんとか解消できました;;

実践的なコードも書きつつ、お昼の読書代わりに基礎の本もちょこちょこ読み進めようと思います。

たまにこうやって備忘録を書いていければと思います。
読んでいただいた方、ありがとうございました。

気になったこと

変数やメソッド、クラスの名前って皆様どうやって決めてるんでしょうか…?
命名規則とかありそうだけどすごいぐちゃぐちゃです。

この記事が気に入ったらサポートをしてみませんか?