前回軽くTextureへ直接描画をする方法を紹介しました。
http://lab7.blog.jp/archives/2924409.html

今作っているゲームはこの方法を基盤にするものです。
せっかくなので、初心者でも使いやすく、もう少しこの描画ロジックを説明しようかと思います。


まず、Texture への描画ロジックは以下です。
より分かりやすいように、日本語でのコメントいっぱい入れてみました。
移動する GameObjectが、Fieldの Texture上での自分のUV座標を引数に Paint_Lineメソッドを呼び出す形です。

public class Test_Draw : MonoBehaviour {
 // テクスチャは正方形、移動オブジェクトは立方体の前提
 private const int C_TEXTURE_SIZE = 500;//テクスチャの一辺のPixel数
 private const int C_OBJECT_SIZE = 25; //立方体一辺のPixel数
 private Color[] buffer; //色情報操作用のバッファ配列
 private Color OBJECT_COLOR = Color.yellow; //塗る色の指定
 // 塗るテクスチャ座標はオブジェクトの中心座標なので一辺の半分を事前計算
 private int object_Halfsize = (int)( C_OBJECT_SIZE / 2);

 //説明①
 public void Paint_Line (Vector2 point) {
  // UV座標をテクスチャのPixelでの座標に変換
  // この変数をループでの変数に使うので int に型変換
  int point_X = (int) (point.x * C_TEXTURE_SIZE);
  int point_Y = (int) (point.y * C_TEXTURE_SIZE);

  // 現在のTextureの色情報をバッファ配列にコピー
  Texture2D mainTexture
= (Texture2D) GetComponent<Renderer> ().material.mainTexture;
  Color[] pixels = mainTexture.GetPixels(); //説明②
  buffer = new Color[pixels.Length];
  pixels.CopyTo (buffer, 0); //説明③

  //オブジェクトのある X,Y座標(UnityのX,Z座標)部分のPixel座標をループ。
  for(int x = point_X - object_Halfsize;
x < point_X + object_Halfsize; x++){
   for(int y = point_Y - object_Halfsize;
y < point_Y + object_Halfsize; y++){
    // バッファ上でオブジェクトのある Pexel座標の色情報を変換
    buffer.SetValue (OBJECT_COLOR, x + C_TEXTURE_SIZE * y);
   }
  }

  // 色変換をした色情報バッファをテクスチャに反映
  Texture2D drawTexture = new Texture2D (mainTexture.width,
mainTexture.height, TextureFormat.RGBA32, false);
  drawTexture.filterMode = FilterMode.Point;
  drawTexture.SetPixels (buffer); //説明④
  drawTexture.Apply(); //説明⑤
  GetComponent<Renderer> ().material.mainTexture = drawTexture;
 }
}

説明①:
Paint_Lineメソッドの引数 Vector2 pointはテクスチャのUV座標を渡す。
UV座標とは原点 (0,0)がテクスチャの左下で、右上が (1,1)となります。
よって、0~1の範囲と言うことになります。

説明②:
Color[] Texture2D.GetPixels:テクスチャからピクセルの色情報を取得します。

説明③:
CopyTo:配列のコピー。配列のコピーでは=を使うと参照コピーになってしまう。
http://lab7.blog.jp/archives/2651297.html

説明④:
Texture2D.SetPixels(Color[] colors):色情報バッファをテクスチャに反映。
テクスチャにピクセルカラー配列 colors(上記プログラム内ではbuffer)を指定します。

説明⑤:
Texture2D.Apply:SetPixels関数による変更を実際に適用する。

Sponsored Link