2014.05.02
wolfgang

あんまりUnityの話では無い・・・

はじめに・・・
今回の記事でのプログラム部分ですが、インデントの設定がわからず
非常に見にくくなっております。
次回の記事までには模索しておきますので、今回はお許しください。

 

お久しぶりです、ペリーコです。

去年の2月に「mmd for unity」というプラグインでmmdを入れてゲームを作っていたのですが、また最近も、●なっしーの素材をひろって遊びました。

 

さて、前回unityの導入まで簡単に説明しましたが
今回こそはちゃんと汎用的な何かを書きます。

今回はゲームサイズについてのカメラ設定です。

android端末の開発において、画面サイズを指定しないと
端末ごとにサイズが違うのでとんでもなくなります。(IOSの場合は端末の種類が限られるのでそれぞれ根気よくがんばればいいのではないでしょうか!(笑))

簡単に図で説明するとこうです。↓

理想現実上:自分の端末で設定したもの 下:そのデータを他の端末で表示したもの

 

と、このように自分の端末ではいい感じに設定したとしても
自分の端末より小さい画面のモノは、はみ出てしまいます。

もし、左側の月がHPや重要な情報をあらわしているのであれば、結構な欠陥ですよね
当然、逆の可能性もあり、左上においたのに
もっと画面の大きいやつだとちょっと中央に寄ってる・・・とか

その為にまずゲームのサイズを決めましょう。

ココからは文字ばっかりになってしまうので
「android開発の画面設計は気をつけないといけない理由」がわかった方はスルーしてくださっていいとおもいます。
書くのも非常に疲れました。

さて、Untiyでの画面の設定ですが当然、カメラを設定します。スクリーンショット 2014-05-02 15.09.01
↑がんばってオレンジで色つけました。
この部分を設定することで見える範囲、開始位置の設定ができるんです。

具体的にどうするかと言いますと・・・

仮にゲームサイズを 800 * 1280としましょう
様々なサイズに対応させるのですがわかりやすくする為に
仮の端末サイズ 480 * 800を設定します。

お気づきでしょうが、サイズが全然足りません。
じゃあゲームサイズを小さくしますか?ってわけではなく
注目すべきは比率です。

800 : 1280 の比率を守ればいいんです。
約分すれば 5 : 8 です

3つの条件さえ守れれば画面サイズはなんとか埋まります。

条件
 1:指定サイズの比率を守る
 2:端末のサイズをはみ出さない
 3:2の範囲で最大にする

求め方

1:指定サイズの比率を守る

先ほど、5:8 と出しましたがその答えの過程がプログラムには必要です。
二つの数字の最大公約数を求めることができれば最小の割合がだせます。 ※最近気づきました

ここでは、ユークリッドの互除法と言う方法で最大公約数を求めます。

http://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%BC%E3%82%AF%E3%83%AA%E3%83%83%E3%83%89%E3%81%AE%E4%BA%92%E9%99%A4%E6%B3%95

例文が非常にわかりやすかったです。

これをプログラムにすると

//指定サイズ;
int TARGET_WIDTH = 800;
int TARGET_HEIGHT = 1280;

///画面サイズ取得;
int ScreenW = Screen.width; //480;
int ScreenH = Screen.height; //800;
int sw = TARGET_WIDTH;
int sh = TARGET_HEIGHT;

///最終的に最大公約数になる変数;
int commonDivisor = 0;

//お互いの数字が0にならない間続ける;
while (sw != 0 && sh != 0) {
   if(sw < sh){
   //あまりを算出;
   commonDivisor = sh % sw;
   sh = commonDivisor;
   //割ってない方の数字を今現在の公約数に;
   commonDivisor = sw;
 }else{
  //あまりを算出;
  commonDivisor = sw % sh;
  sw = commonDivisor;
  //割ってない方の数字を今現在の公約数に;
  commonDivisor = sh;
 } //if end
} //while end

sw = TARGET_WIDTH / commonDivisor;
sh = TARGET_HEIGHT / commonDivisor;

自分が書くと無駄が多い気がします・・・
これによって最後のsw , shが 最小の比率 今回の場合「 5 : 8 」になります

もう、この辺りで終了したいんですがキリが悪いので最後までやり切ります。

2:端末のサイズをはみ出さない
3:2の範囲で最大にする
この二つを同時に行います。

最小の比率がでたので地味に足していきます(笑)
//描画サイズ
int renderW = 0;
int renderH = 0;
while (true) {
 if( (renderW + sw) > ScreenW || (renderH + sh) > ScreenH){
  break;
 }
 renderW += sw;
 renderH += sh;
}

この処理を抜けたときのrenderW , renderHが
条件1、2、3をクリアしたサイズになります。
今回の場合は480 : 768

この数字をunityのカメラに反映させましょう
カメラが1こなら
Camera.main で取得できるとおもいます。
そのrectという項目をいじります。
が、その前に unityのカメラの設定だと範囲が0〜1な訳です・・・
このあたりはサクッとやりましょう

///0~1に対応したサイズに変換
float cw = (float)renderW / (float)ScreenW;
float ch = (float)renderH / (float)ScreenH;

///カメラ情報を取得;
Rect r = new Rect();
Camera.main.rect = r;

///カメラの描画範囲設定
r.width = cw;
r.height = ch;

///カメラの描画開始位置設定;
r.x = (1.0f – cw) / 2;
r.y = (1.0f – ch) / 2;
Camera.main.rect = r;

さらに細かいことをしたい場合は修正を含める必要がありますが
ゲームの制作を始める方にはきっとちょうどいいと思います!!

すごく長くなりましたが、実際やってみるのが
一番です。
時間がかかってめんどくさいですが、一番早く身に付くんじゃないかなと思います。

なぜその処理をするのか
自分で解明しながら進めるとよりいっそう理解できると思います。

次回は、もっと短めにします・・もうしません

ありがとうございました。