読者です 読者をやめる 読者になる 読者になる

(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

SpriteModeがMultipleのTextureから、設定したSpriteの画素値だけを取得する【Unity】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 5.5.1f1


はじめに

Unityでは、Textureの設定でRead/Writeを有効にすると、

GetPixelsを使う事でTextureの画素値を取得する事が出来るようになります。


f:id:kan_kikuchi:20170305151032j:plain

//テクスチャの全画素値を取得
Color[] pixels = texture.GetPixels();


しかし、SpriteModeがMultipleの場合、元の大きな画像の画素値を取得してしまいます。


例えば以下のように128×128のSpriteを設定し、


f:id:kan_kikuchi:20170305151835p:plain


このSpriteの全画素値(128×128=16384)を取得しようと思い、GetPixelsを使っても、

元画像の全画素値(2048×1024=2097152)を取得してしまいます。

//画素数をログ表示
Debug.Log("画素数 : " + GetComponent<SpriteRenderer>().sprite.texture.GetPixels().Length);

f:id:kan_kikuchi:20170305151955p:plain


なので、設定したSpriteのみの全画素値を取得するメソッドを作りました!

今回はそれをご紹介!


GetPixelList

コードは以下の通りです。

/// <summary>
/// 入力されたスプライト部分だけの画素値をリストで取得
/// </summary>
public static List<Color> GetPixelList(Sprite sprite){
  //テクスチャから画素値を取得
  Texture2D texture = sprite.texture;
  List<Color> texturePixelList = new List<Color>(texture.GetPixels());

  //スプライトの位置とサイズを取得
  int x = (int)sprite.textureRect.x, y = (int)sprite.textureRect.y, width = (int)sprite.textureRect.width, height = (int)sprite.textureRect.height;

  //スプライト部分の画素値だけ抜き出す
  List<Color> pixelList = new List<Color>();

  for (int yNo = y; yNo < y + height; yNo++) {
    for (int xNo = x; xNo < x + width; xNo++) {
      pixelList.Add(texturePixelList[xNo + yNo * texture.width]);
    }
  }

  return pixelList;
}


使い方は全画素値を取得したいSpriteを渡すだけです。

//画素数をログ表示
Debug.Log("画素数 : " + GetPixelList(GetComponent<SpriteRenderer>().sprite).Count);

f:id:kan_kikuchi:20170305152442p:plain