Resourcesフォルダから画像ファイル取得?Inspectorに指定?スプライトを動的に切り替える
この記事の対象者
unity初心者向けです。私がunity始めたころに躓いたところを重点に。
つよつよプログラマーじゃないので専門用語は使いません。というかわかりません。
Resourcesフォルダから画像ファイル取得
Resourcesフォルダ内に複数の画像ファイルがあり、それをゲームシーンのオブジェクトに動的に貼り付け、切り替える方法です。
電光掲示板に、着順番号を表示します。番号は画像ファイルになっています。
Resourcesフォルダから画像を読み込み、指定した番号に応じて、電工掲示板の画像を変更します。
Scene内のRank_1~Rank_5の2Dスプライトを変更します。
Resourcesフォルダからの読み込み
<Resources/Image>内に切り替えたい画像を入れます。
void Start()
{
Sprite sprites = Resources.LoadAll<Sprite>("image/");
}
上記コードで、sprites配列にimageフォルダ内のスプライトを読み込めます。
が、ここで問題があります。
読み込んだsprites配列を見てみると、
1,2,3,4・・・とは並んでおらず、
文字としての昇順に並んでいます。1、10,11,12・・・
この並びだと、
「2番を表示したい!」
と思ったときに、配列の[9]を指定しなければなりません。
画像の枚数が変わると順番が変わり破綻します。
(画像名をチェックするなどすれば可能ですが、メンドイ)
Inspectorから指定してあげる
私は、ちょっと調べてめんどくさい、と感じたら別の方法で実現しようと考えます。
個人開発なので、コードの見た目や賢さは気にしません笑
開発中のRoidChanDerbyはスクリプトで一括ロードはせず、Inspectorに指定して使っています。個人的にこっちのほうが楽。
public Sprite sprites;
クラスのメンバ変数を上記のように「public」にすると、unityのInspector上から設定できるようになるので、そこに直接設定します。画像の枚数が多いとこの方法は面倒ですが。。
上記画像のように、Inspectorからサイズを指定して、直接画像ファイルを設定します。
こうすることで、配列の引数と画像の番号を明示的に合わせてやることができます。
sprite配列の中身が自分の並べたいように並んでます(2番を表示したければ、配列も「2」の指定でOK!)この方法は、追加は楽ですが削除は大変です。。。
読み込んだ画像を2Dスプライトに指定
読み込みが終われば、あとは2Dスプライトに指定するだけです。
GameObject.Find("Rank_1").GetComponent<SpriteRenderer>().sprite = sprites[2];//sprite配列からspriteを設定
GameObject.Find("Rank_2").GetComponent<SpriteRenderer>().sprite = sprites[1];//sprite配列からspriteを設定
GameObject.Find("Rank_3").GetComponent<SpriteRenderer>().sprite = sprites[5];//sprite配列からspriteを設定
GameObject.Find("Rank_4").GetComponent<SpriteRenderer>().sprite = sprites[8];//sprite配列からspriteを設定
GameObject.Find("Rank_5").GetComponent<SpriteRenderer>().sprite = sprites[15];//sprite配列からspriteを設定
上記例では、2DスプライトオブジェクトをGameObject.Findで取得した後、SpriteRendererコンポーネントのspriteに、先ほどInspectorで設定したsprite配列のspriteを設定しています。
このコードをStartに記述し、実行すると、
こうなります。
コード全体は以下です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ImgChange : MonoBehaviour
{
public Sprite[] sprites;// Start is called before the first frame update
void Start()
{
GameObject.Find("Rank_1").GetComponent<SpriteRenderer>().sprite = sprites[2];//sprite配列からspriteを設定
GameObject.Find("Rank_2").GetComponent<SpriteRenderer>().sprite = sprites[1];//sprite配列からspriteを設定
GameObject.Find("Rank_3").GetComponent<SpriteRenderer>().sprite = sprites[5];//sprite配列からspriteを設定
GameObject.Find("Rank_4").GetComponent<SpriteRenderer>().sprite = sprites[8];//sprite配列からspriteを設定
GameObject.Find("Rank_5").GetComponent<SpriteRenderer>().sprite = sprites[15];//sprite配列からspriteを設定
}}