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

IwamotoBlog

俺に付いて来い

SpriteRendererのbounds.size.xとScreen.widthのサイズ違う問題でハマったお話

Unity

なんかオシャレなアプリを作る案件に携わらせて頂いく事になりまして、感謝カンゲキ雨嵐です。
まあSwiftやらSpriteKitやらを使って作る技量も気力もないので、当然の様にUnityでやります宣言をしました。こういう時Unityは本当に有り難いですね。
で、本題に入るんですがある日背景画像の無限スクロールなんかを実装したいなあと思ったんです。まあ、Sprite一つ一つにpublic変数持たせてどうのこうのなんて辛い事したくないので、順当に画面サイズとかSpriteのサイズとかをイイ感じに使って実装したいですよね。
そんな時、悲劇は起きました。

明らかにサイズが違う

// Use this for initialization
void Start () {
    print ("SpriteSize" + this.GetComponent<SpriteRenderer> ().bounds.size.x);
    print ("ScreenSize" + Screen.width);
}

まあこんな感じの事をして、とりあえずそれぞれの横幅の値を見ようと思ったんですね。
するとこうなりました。

f:id:PEPOipod007:20151113235759p:plain

「おお」と思ったんですが、いやいや待てよ、明らかにおかしいんです。
だってこのSpriteのwidthはScreenのwidthの明らかに5倍以上はあるんです。なんならScreenのwidthがSpriteの5倍近い値が出ている現状、おかしいですよね?

割と簡単な問題でした

割と簡単とか書いときながら3日間位費やしたんですけど、問題自体は割と簡単でした。
即ち、GetComponent<SpriteRenderer> ().bounds.size.xで出てくる値はUnityのWorld上でのwidth。
対して、Screen.widthで出てくる値はスクリーンとしての画面のピクセル幅との事らしいです。

起こっている事が分かれば後は簡単ですね。どちらかのサイズに寄せてあげるという事をしましょう。
僕はScreenのサイズをUnityのWorldサイズに寄せる方を取りました。こんな感じです。

// Use this for initialization
void Start () {
    print ("SpriteSize" + this.GetComponent<SpriteRenderer> ().bounds.size.x);
    print ("ScreenSize" + Camera.main.ScreenToWorldPoint (new Vector3 (Screen.width, Screen.height, 0)).x);
}

ScreenToWorldPoint()は引数にVector3を取る関数ですので、zには適当に0でも入れときましょう。
実行結果がこちらです。

f:id:PEPOipod007:20151114001812p:plain

無事正しい値が叩き出されましたね。幸せです👏👏👏

おわりに

結構僕みたいな初心者がズブズブ嵌りそうなポイントなのに、日本語の記事が一つも見つからなかったので僭越ながら書かせて頂きました。
Unityは初心者のために沢山の罠や沼を用意してくださっている素敵なゲームエンジンだと思います。皆さんも積極的に沼にハマって記事を沢山書きましょう。