ループの考え方

なぜ　ここの数字は 2 なのか、とか　コメント書くのが　めんどくさいので
Qiita に書いて　プログラムのコメントには　**参照:**、**参照:**、ばっかり書くことにする。

画像が１６枚ならんでいるとしよう。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a10b2.png?raw=true)

わたしの感覚では　左上から　０、１、２　……　と番号が振ってあると分かりやすいんだが、UnityのTexture2D は 左下が原点と言って聞かん坊なので　それに合わせることにする。ループ・カウンターは

Ｙが　３から　－１の手前、
Ｘが　０から　４の手前、

まで回せばいい。Ｃ＃風に書くなら

    // オヌヌメの書き方
    for( int y = 3; -1 < y; y-- ){
        for( int x = 0; x < 4; x++ ){
        }
    }

だろうか。ここで、 **次のようには書かない** という考え方がある。

    // わたしが避ける書き方
    for( int y = 3; 0 <= y; y-- ){
        for( int x = 0; x <= 3; x++ ){
        }
    }

#違い

|書き方Ａ|書き方Ｂ|
|---|---|
|３から－１の手前まで|３から０まで|
|０から４の手前まで|０から３まで|

これは、数字をなんだと思ってるかによって　違ってくる。

指を使って　１、２、３　と数えるときは **書き方Ｂ** が分かりやすい。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a11.png?raw=true)

これで十分じゃないか、と考える人は
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a12.png?raw=true)
３時に待ち合わせしましょう、という時に

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a12b.png?raw=true)
３時２９分にやってくる。

３時に待ち合わせといったら　３時００分だろう！　というのは **解釈の１つだと思うんだが** 口に出すと怒られるので言わない。

一応もうひとつ例を出しておこう。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13.png?raw=true)
ここで　青い日と　赤い日　は、**休日ではなく遊ぶ日** だ。ここで仕事の締め切りが１７日なら、仕事はいつまでに終わらせればいいだろうか。

**１７日に締め切りといったら　１７日００時００分だろう！**

２０日の朝６時３０分　とか答えていいのは　インディーズ・ゲーム開発者だけであって　わたしの感覚的には　１７日いっぱいの１７時３０分ぐらいかな、と思うんだが　これも **解釈の１つだろう。**

つまり　指には、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a11b2.png?raw=true)
３．９９　とか無いのだ。かっこよく言うと　離散的だ。

むしろ
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a14.png?raw=true)
くそ小学生から見れば　数字に途切れなんか見えない。

りんご１つと　りんご１つを足すと　りんご２つというのは　りんごのサイズはみなだいたい同じという　算数を教えたい教師の都合のようなもので、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a14b2.png?raw=true)
くそ小学生には　りんごが２つであることに　どういう意味があるのか分からない。

むしろ
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a14b3.png?raw=true)
りんごは　沼の下で１本の根につながっているかもしれない。ワンチャンある。算数が大嫌いだ。

つまり　これらの方法は　１点を指そう、としているところに問題がある。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a11b3.png?raw=true)

オヌヌメの方法は　閾値（しきいち）を使うことだ。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a12c.png?raw=true)
この図が言わんとしていることは、０時から、３時は含まないその手前だ。

日本語にすると　３時より手前で待ち合わせしよう、ということになる。

じゃあ、待ち合わせ場所に　０時に来てもいいし、２時５９分５９秒に来てもいいことが分かる。

あのカレンダーで言うなら、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13b2.png?raw=true)

日本語で言うなら　１８日より手前が締め切りだ、　ということになる。

１７日の２３時５９分５９秒までオッケーだろう。実際　イベントの締め切り日の２３時４５分から　Ｗｅｂサイトを開いてフォームにキータイピングを開始する時間ぎりぎり平気症の人もいるだろう。

じゃあ、**２３時５９分５９秒までオッケー** でいいじゃないか、という人もいるが **２３時５９分５９秒９９９ナノ秒はオッケーなのか？ダメなのか？** という疑問が晴れない。解釈の１つだ。

数字は　どんなにピンポイントで示しても　小さな端数　が気になってしまう。
**１８日の手前まで** という閾値を用いた方法は　小さな端数　を気にしなくてよくなる　良い方法だ。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a14b4.png?raw=true)
くそ小学生も　一時的におとなしくなるだろう。

これからは　もう　こう書きたくなるだろう。

    // オヌヌメの書き方
    for( int y = 3; -1 < y; y-- ){
        for( int x = 0; x < 4; x++ ){
        }
    }

この症状が　ひどくなってくると、こんな書き方をしたりもする。

    // 我流
    for( int tickY = THIS_Y; NEXT_Y < tickY; tickY-- ){
        for( int tickX = THIS_X; tickX < NEXT_X; tickX++ ){
        }
    }

tick というのは　チックタック時計が進んでいくことだが、刻んでいる。図で示すと……。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13b3.png?raw=true)
例えば THIS_X が 10 で、NEXT_X が 18 ということになる。tickX は 10から17だ。

この方法の利点の１つとして、NEXT_X を THIS_X に移せば、そのまま次のディビジョンが始められることだ。ディビジョンという言葉が難しければ、セカンド・シーズンとか　次の区画とか　そんな意味だ。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13b4.png?raw=true)
ホリデーから始まるディビジョンとか　嫌なものを見た。

で、このことの何が利点なのかというと、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13b5.png?raw=true)
開始地点だけ示せば　いいわけだ。これが閾値を使う利点。

閾値を使わない場合、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a13b6.png?raw=true)
開始地点と、終了地点の２つを毎回　用意することになる。 **これが　煩わしい。** 開始地点があれば、終了地点も兼ねるのだから。

再掲しておこう。

    // オヌヌメの書き方
    for( int y = 3; -1 < y; y-- ){
        for( int x = 0; x < 4; x++ ){
        }
    }

    // わたしが避ける書き方
    for( int y = 3; 0 <= y; y-- ){
        for( int x = 0; x <= 3; x++ ){
        }
    }

お絵描きに疲れたので　いったん休憩して　またこの続きに記事を続けたい。

#ＲＧＢは　２５５，２５５，２５５　とは限らない

ところで　月面宙返り３回転ひねりをしていいだろうか。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a15b2.png?raw=true)

バグが取れんなぁ、と思って　たんたんとログ出力する内容を広げていたんだが、RGB値を見てみると 0.5019608 とか出ていた。

128 を 255 で割ると 0.50196078431……　なので、何が起こったのが想像に難くない。

どうも、Unityは何でもかんでも数字を 0.0～1.0 に normalization したいのかもしれない。おっちゃん、泣けてくるほっほ。

コメントに一言　書いていてくれれば　こんな記事　書かずにさっさと 255 掛けてたんだが……。

一応　あとで　記事は続ける。

#バグを取ること
Visual Studio 2015 のC#のライブラリで書いたコードを UnityのC#ライブラリで書いたコードに移植したつもりなんだが、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a16.png?raw=true)
生成物を比較してみると　部分的に同じで、部分的に異なっている。

処理の途中の生成物を出力してみるのもいいかもしれない。

コピペ・プログラマーもこんな気分だろう。おっ、いけるいける、と思って Rectangle を Rect、Bitmap を Texture2D に置き換えたら　コードは張り替えられてコンパイルも通るのに　処理内容の詳細が違うわけだ。

ぶっちゃけ　Ｙ座標　に関わるところが　ごっそりおかしく、その他に　ちょいちょい違うところがある程度なので　見た目の相違ほどのひどさもないと思うが。

あとで　記事は続ける。

#ループのことなんかどうでもよくなってきた
不具合の探し方なんだが、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a16b3.png?raw=true)
左がバグった出力結果、右が正常な出力結果。

数字を見てみると -1.04 ずれているようだ。

そもそも　この数字が何かというと、Unity の Offset Y に入れる値なんだが、元の画像では1ピクセルであっても、Unityの画面上では　グリッド１つ 100ピクセルだったり、ゲーム・オブジェクトのサイズや、拡縮のスケールが加味されていたりして　なんだか分からない計算結果になっている。

まあ、ここでは 100倍して -104ピクセルずれている、と見ていい。

で、エラーが起こっている個所は　４つごとに１つ飛ばしになっているが、
立ち、跳ね、走り、屈み、その他　を１セットで　４キャラ分あるんだが、立ち、跳ね、走り、屈み　が全部間違ってますよ、ということだ。

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a17b.png?raw=true)
１７　というのは　左上を０として１７枚目、ちょうど赤い枠が描かれている画像だが、ここで　赤い枠の場所を読み間違えているというものだ。

で、１スライス　１２８ｘ１２８ピクセルサイズで、グリッドは　８ピクセル単位。
出力された数字は　１２８ｘ１２８ピクセルの枠の中心から相対的に全部　縦－１０４ピクセルずれているというのを示していて、104ピクセルも上にずれているのだろうか。

このタイル画像は 1024x1024 サイズで、Texture2Dは左下原点ということで、Yは1023～-1の手前までループするようにしている。

##あ、違う
Yは上に行くほど数字が増えるんだから、-104ずれているんだったら　下に104ずれているんだった。

例えば -128 ずれてるんだったら　分かりやすかった。１スライス分、１段下を見ているということだ。

    128 - 104 = 24

この 24 は何か。確かに、赤い箱を見ると グリッド３セル分、24 ピクセルの厚みがあるが……、**ん？**

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a17c.png?raw=true)

24 下にずれているって？

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a17g.png?raw=true)

正しい値の -4 ピクセルというのは、画像の中心から上に 4ピクセル上がったところに　赤枠の中心Y があるということなんだが、
（注・**この記事で全部間違っているが**、正しい値は 4 ピクセルであって、画像の中心から上に 4ピクセル上がったところに赤枠があるというのは合っている。 -4 ピクセルという数字もあるがこれは別の画像の赤枠だ。この記事を読む上で特に困らないだろう）

例えば

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a17i.png?raw=true)

そもそも 8 ピクセル上にずれていて、－１段目から検知を開始していて、３段目を調べると　その１段下に赤い枠があって検出してしまっていて、その赤枠の中心位置を求めるときに　Rect の center.y プロパティーを拾っているんだが　縦幅の半分が中心位置とすると　プラス値になっていて　座標は　折り紙を半分折り返したように上に上がってしまう、

と考えてみる。**うーん、苦しい。**

#あ、直った

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a18b.png?raw=true)

center プロパティーは、プラス、マイナスが逆なんじゃないか、と思って自分で書き直したんだが、

![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702221616a19.png?raw=true)

直った。

あっ、そう……。

よく分からんバグだった。

#プログラムのコメントを楽しようと思ってQiitaに書いているんだが

Texture2Dは左下原点の座標で、Rectは左上原点の座標なんで、あとはよろしく、みたいなコメントでいいのだろうか。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a5b1.png?raw=true)
上図赤い枠が Texture2D。いわゆる画像。左下が原点でYは上にいくほど増える。緑色の枠が Rect。いわゆる矩形サイズ。左上が原点でYは下にいくほど増える。

例えば　こんな座標があるとき、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a10.png?raw=true)

Texture2D では Yは上にいくほど増えていくので、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a10b3.png?raw=true)
そうか、上に行くほど増えていくんだな、と思うわけなんだが

Rect では Yは下にいくほど増えていくので、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a10b4.png?raw=true)
縦幅の半分を足せば　ちょうど　これぐらい。

そうですか。

じゃあ、まあ　これで。

#Ｙをループで回そう。
で、Ｙをループで回していくんだが、例えば 1024x1024 の画像なら、1023から-1の手前まで読み取っていけばいい。

ソースコードの中では、２つの -1 が出てくる。これが何かなんだが……。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a20b2.png?raw=true)

1024 から 1 引いて 1023 にして、
0 から 1 引いて -1 にしている。

**３時５９分５９秒９９９ナノ秒** の理屈から言えば **1023.99999 にしなくていいのか** という発想にもなるんだが、画像は 1ピクセルより小さな端数は出てこないのでこれでいい。

最後に画像を　貼っ付けておく。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-02/201702212141a10b5.png?raw=true)

これで記事を終わる。