ユニティちゃんの2Dスクロールアクション:改 その1-3マテリアルとスプライト【チュートリアル】

ども、ゴコーです。

今回の蛇足となる3週目記事はキャラクターの表示とスプライトについてです。

スポンサーリンク

スプライトについてざっくり


sprite -【意味】妖精,小妖精 http://ejje.weblio.jp/content/sprite
訳が分からないよ…


本チュートリアル内では操作キャラクターにユニティちゃんのドット絵を使っていますが、その1-1から見ているように、元の画像はいくつかの画像がある程度まとめられたものです。
当然ですが、元の画像素材をそのまま画面に表示しても分割された状態で勝手に表示してくれるなんてことはありません。分割表示するための何かをUnityが実行してくれているから何気なく分割済みのキャラクターを使えている訳です。

ある一つのオブジェクトを表示する、ということの中にも実はいくつかの過程が挟まれています。例えばこんな感じに。
今回の場合、先ほどのリンクではさらっと流されているマテリアルが鍵を握っています。

マテリアルは「どういう風に表示するかという情報」を管理するアセットです。

それは例えば、「どんな色なのか」「どのくらい光を照り返すのか」「どのくらい透明なのか」といった色や表示に関係するものも管理しますし、「画像のどの部分を表示するか」といったものも、その範囲内です。
スプライトはその「画像の部分表示」を利用していると思って下さい。
ここからここまでの範囲がスプライト1、みたいな感じで分割し、分割情報を元に画面に画像の一部を表示しているのですね。

あいまいな書き方になっているのは僕自身ちゃんと理解できているとは思えないからです。
このブログのコンセプト通り、知識ある人が通りがかってくれるのをまってます(人任せ)

ではなぜこんな面倒なことをするのでしょうか?
理由の一つはドローコールにあります。

ドローコールとは描画処理のことです。
乱暴な書き方をすれば、Unityでは「この色を塗って!」という指示を出す度に処理が走り、CPUに少なからず負荷がかかっています。
その「色塗り指示」はマテリアルの数だけ出されるのですが、例えば30種類からなるマップチップを全て異なるテクスチャから作成した場合、一瞬の間に30回「色塗り指示」を出す事になってしまいます。

それが一つのマテリアルの中に情報を詰め込んだ場合は事情が変わります。
マテリアルの数だけ描画処理が呼ばれるのであれば、数を一つにすれば描画処理も1回になる訳です。

mat02

まあ、今回はドローコールを引き合いに出しましたが、今はドローコールよりも、「どのように表示するのか」という部分が重要みたいですけどね。シェーダーに何を使うか、という問題です。
例えば、半透明のシェーダーを使うと、後ろのものも描画しないといけないからちょっと負荷が増えちゃう、みたいな感じですね。

この一文により、この記事の蛇足感がますます強まった所で次に行きましょう。
とにかく、スプライトはそういった「負担軽減の仕組み」を色々とりそろえた画像だということは何となく覚えておきましょう。

2014/12/04追記

最近 Unityユーザー助け合い所にて大前さんがこれについて言及されてました。
https://www.facebook.com/photo.php?fbid=1499489360332527&set=gm.796154333777842&type=1

要するに、透明にするのってコンピュータ的にしんどいのでスプライトはそこら辺を解決してくれているのですね。

スプライトの様なものを実装

スプライトについてざっくり知ったところで次は、スプライトの様なものを実装してみたいと思います。
ぱっと思いつく方法は2つあります。

1つ目は元々分割されている画像を配列に収め、画像を次々と切り替えて行く方式
2つ目は複数の画像を一つの画像にまとめておき、マテリアルに指示を出して読み取る座標を変えることで画像を切り替えて行く方式

1つ目の方式で行くと、前半が完全に無駄になってしまいます。
それはそれでおもしろいですが、その方式なら誰にでもできますし今日の所は2つ目の方式で行きましょう。

ちなみにこのコードの解説はしません。なぜっていろんな意味で無駄だからです。

このスクリプトをQuad辺りに貼り付け、BaseTextureにはいずれかのテクスチャを指定し、TextureResolutionにはジャンプ系のものには70を、それ以外には64を指定してください。ジャンプ系の場合70なのはテクスチャの大きさが違うからです。要は昔の僕の発注ミスです。
昔のぼくを殴りたい。

BaseTextureは切り出すテクスチャで、TextureResolutionはテクスチャの解像度、つまり切り出しは一枚何ピクセルでやるかという指定になります。
そして今回の場合、スペースキーを押す度にテクスチャが更新されます。

な、なんて書く労力の割に役に立たないコードなんだ…!!

そんなこんなでキャラクターの表示編を終わります。
次回からは移動関係をやっていきたいと思います。

では、また。

Comments

comments

スポンサーリンク
336*280px