I am Charmie

メモとログ

Unity 2D で画像を動的に切り替える

とりあえず3行で

  1. Unity 2Dで
  2. Scriptを駆使して
  3. ゲーム実行中に複数枚の画像を切り替える

動画確認バージョン

以下のUnityで動作確認済み

  • 2018.3.7f1
  • 2019.1.3

手順

そんなに大変じゃない.

手順 1 プロジェクトの新規作成

2Dのプロジェクトを新規作成

手順 2 準備

手順2-1から2-3は順不同.

手順2-1 画像ファイルの準備

ゲーム実行中に表示したい画像ファイルをAssets/Resources下のフォルダ内に保存する.

  • 今回はAssets > Resources > Texturesというフォルダにleft01.jpg, ..., left14.jpgというファイルを保存した (下図参照)
  • 保存するフォルダはProject > Assets > Resources以下のフォルダなら何でも良い
  • Assets内にResourcesフォルダが存在しなければ作成する
  • 後述するスクリプトのパスの設定次第では全く違うフォルダに保存しても大丈夫かもしれない (未検証)

f:id:charmie11:20190521002440g:plain

手順2-2 画像表示用オブジェクトの準備

画像表示用オブジェクトSpriteをシーンに追加する.

  • GameObject > 2D Object > Sprite で追加
  • Sprite追加後のHierarchyは下図のようになる

f:id:charmie11:20190521002729g:plain

手順2-3 画像検索+表示用スクリプトの準備

画像検索+表示用スクリプトを用意する.

  • Assets直下にC#のScriptを新規作成 (Assetsを右クリック > Create > C# Script)
  • 名前はデフォルト(NewBehaviourScript)のまま
  • スクリプト追加後のAssetsは下図のようになる

f:id:charmie11:20190521002453g:plain

手順3 スクリプトの更新

手順2-3で作成したスクリプトの内容を下記の内容に更新する.

  • classの中身だけ変更すればOK
  • 手順2-1で画像を保存したフォルダ名がTexturesでない場合は,const string DIR_IMAGES = "フォルダ名";の部分を修正
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
  public int m_index = 0;
  public int numImages;

  const string DIR_IMAGES = "Textures";
  SpriteRenderer m_SpriteRenderer;
  public Sprite m_Sprite;
  public Sprite [] m_Sprites;
   // Start is called before the first frame update
  void Start()
  {
    // Retrieve all images in DIR_IMAGES
    m_Sprites = Resources.LoadAll<Sprite>(DIR_IMAGES);
    numImages = m_Sprites.Length;
    Debug.Log("#images: " + m_Sprites.Length);
    m_SpriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    m_SpriteRenderer.sprite = m_Sprites[m_index];
  }

  // Update is called once per frame
  void Update()
  {
    float motion = Input.GetAxis("Mouse ScrollWheel");
    if (motion != 0f )
    {
      if (motion > 0f ) // forward
      {
        m_index = (m_index+1) % numImages;
        Debug.Log("m_index: " + m_index);
      }
      else if (motion < 0f ) // backwards
      {
        --m_index;
        if(m_index < 0)
        {
          m_index = numImages-1;
        }
        Debug.Log("m_index: " + m_index);
      }
      m_SpriteRenderer.sprite = m_Sprites[m_index];
    }
  }
}

手順4 スクリプトをSpriteに紐づけ

手順3で更新したスクリプトを,手順2-2で作成したSpriteに紐づけする.

  1. HierarchyウィンドウのNew Spriteをクリックしてアクティブにする
  2. (画面左側の)Projectウィンドウのスクリプトを(画面右側の)Inspectorウィンドウにドラッグ&ドロップする

f:id:charmie11:20190521002459g:plain

手順5 実行

実行する.

  • マウスホイールをグリグリスクロールすると表示される画像が変わる.
  • グリグリし過ぎると,最初の画像に戻る.

f:id:charmie11:20190521002505g:plain f:id:charmie11:20190521002510g:plain

気になる点とか

読み込む画像

  • Resources.LoadAll関数を使って,スクリプト内で指定したDIR_IMAGESの画像を読み込んでいる
  • サブフォルダ内の画像も全て読み込むようになっているのがちょっと不便

Debug

  • Window > General > Console を選択するとコンソール画面が追加される
  • スクリプト中にDebug.Log("文字列");と書くと,コンソールに文字列が表示される
  • 上記のスクリプトでは,マウスホイールをスクロールする度に現在選択している画像のインデックスが表示されるようになっている