ゲーム開発、イラスト、KAORAEntertainmentBLOG

It is a blog about KAORAEntertainment game 自作ゲームの情報や作成進捗状況です

Resourcesフォルダから画像ファイル取得?Inspectorに指定?スプライトを動的に切り替える

この記事の対象者

unity初心者向けです。私がunity始めたころに躓いたところを重点に。

つよつよプログラマーじゃないので専門用語は使いません。というかわかりません。

 

 

Resourcesフォルダから画像ファイル取得

Resourcesフォルダ内に複数の画像ファイルがあり、それをゲームシーンのオブジェクトに動的に貼り付け、切り替える方法です。

f:id:KAORA_22:20190807225845p:plain     f:id:KAORA_22:20190807234802p:plain

電光掲示板に、着順番号を表示します。番号は画像ファイルになっています。

 

 

Resourcesフォルダから画像を読み込み、指定した番号に応じて、電工掲示板の画像を変更します。

f:id:KAORA_22:20190807225852p:plain

Scene内のRank_1~Rank_5の2Dスプライトを変更します。

 

Resourcesフォルダからの読み込み

<Resources/Image>内に切り替えたい画像を入れます。

void Start()
{
Sprite sprites = Resources.LoadAll<Sprite>("image/");
}

上記コードで、sprites配列にimageフォルダ内のスプライトを読み込めます。

 

が、ここで問題があります。

 

f:id:KAORA_22:20190807231915p:plain

読み込んだsprites配列を見てみると、

1,2,3,4・・・とは並んでおらず、

文字としての昇順に並んでいます。1、10,11,12・・・

 

この並びだと、

「2番を表示したい!」

と思ったときに、配列の[9]を指定しなければなりません。

画像の枚数が変わると順番が変わり破綻します。

(画像名をチェックするなどすれば可能ですが、メンドイ)

 

Inspectorから指定してあげる

私は、ちょっと調べてめんどくさい、と感じたら別の方法で実現しようと考えます。

個人開発なので、コードの見た目や賢さは気にしません笑

 

開発中のRoidChanDerbyはスクリプトで一括ロードはせず、Inspectorに指定して使っています。個人的にこっちのほうが楽。

public Sprite sprites;

クラスのメンバ変数を上記のように「public」にすると、unityのInspector上から設定できるようになるので、そこに直接設定します。画像の枚数が多いとこの方法は面倒ですが。。

 

f:id:KAORA_22:20190807233514p:plain

上記画像のように、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に記述し、実行すると、

f:id:KAORA_22:20190807234802p:plain

こうなります。

 

コード全体は以下です。

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を設定
}

}