2013年10月05日

[Unity] iPhone5(4インチ)で実行時に上下にスペースができる

iOS7向けのアプリを作っています。
Unity4.2.1を使って、Xcode5を通してiPhone5(iOS7)で実行したときに、なぜか上下に黒いスペースが
出来てしまいました。

原因は、プロジェクトの設定(General)で、4インチ用の”スプラッシュ画像”のリンクが抜けていたことでした。

↓iPhone > Retina 4-inch(640x1136) のリンクが抜けていると、起動時に上下に黒いスペースが入った
スクリーンショット 2013-10-05 10.47.27.png

何故こういうことが起きたかというと、

・UnityでBuildしたままだと、アイコンとスプラッシュ画像の画質が悪くなっていた
・Xcode5で、手動でアイコンとスプラッシュ画像を差し替えていた
・4インチ用の差替え忘れ ← これが原因

たかがスプラッシュ画像と言うなかれ!
まさかこれが原因だったとはー。

■参考
Titanium mobileで作ったアプリをiPhone5向け(4inch)に対応させる
http://umehal.tumblr.com/post/31976817458/titanium-mobile-iphone5-4inch
posted by be-style at 10:55| Comment(0) | Unity

2013年02月23日

[Unity] iOSでのデータの保存先

iPhoneで画像を本体に保存しようとしたときにハマったので備忘メモ。

結論から先に言うと、File.WriteAllBytes()で指定するパスは

Application.dataPath + "/../../Documents/test.png"
■■■ 修正 ■■■
Application.persistentDataPath + "/filename"
■■■ 修正(ここまで) ■■■
でした。


■順を追って説明すると……
画像の保存の仕方を調べると、「EncodeToPNG()」「File.WriteAllBytes()」を使うとよいことがわかった。

Texture2D.EncodeToPNGを使った画像の保存の仕方(Unityリファレンス):
http://docs.unity3d.com/Documentation/ScriptReference/Texture2D.EncodeToPNG.html

Editorでは保存ができたものの、iPhoneでは保存できたかの確認方法がわからない。
 そこで、iPhone内のディレクトリをPCから探索できる「iPhone Explorer」を使って確認してみる。

iPhone Explorer:
http://www.macroplant.com/iexplorer/

確認したら、保存されてなかった orz
iPhoneで保存されるには特殊なパス設定が必要だと判明↓

[Unity3D]ウェブからダウンロードしたファイルを保存したり読み込んだり:
http://terasur.blog.fc2.com/blog-entry-245.html

パスに「Application.persistentDataPath」を使うとリジェクトされる可能性があるらしいとの
記載から対策を調べる↓

[Unity 3D]iPhoneでの保存先:
http://createwave.blog104.fc2.com/blog-entry-199.html

パスの末尾を「/Documents」にしてみた↓

Application.dataPath + "/../Documents/test.png"

保存されない orz
Application.dataPath についてリファレンスを調べてみた↓

Application.dataPath(Unityリファレンス)
file:///Applications/Unity/Documentation/ScriptReference/Application-dataPath.html

すると、こんな記述を発見。
iPhone player: <:path to player app bundle>/<:AppName.app>/Data

iPhone Explorer↓
スクリーンショット 2013-02-23 10.05.51.png

Documentsディレクトリは、同階層じゃなくて階層1つ上にあるじゃないか!
ということで、iOSに保存するときの正解のパスはこれらしい。

Application.dataPath + "/../../Documents/test.png"


■■■ 追記 ■■■
現在はApplication.persistentDataPathに「/Documents」が含まれるとコメントをいただきました。
確認したところ、
Application.persistentDataPath + "/filename"
で実現できました。
■■■ 追記(ここまで) ■■■

審査でリジェクトされるかどうかは、これからやってみないとわかりませんが……。
ひとまず、保存ができてよかった!
タグ:iOS UNITY 保存先
posted by be-style at 10:18| Comment(2) | Unity

2013年01月13日

[Unity] NGUIでドーナツ状ゲージを作ってみた(改良編)

前回の記事では目隠しを使いました。
この方法には欠点がありました。

・背景と目隠しが同じ色じゃないといけない
・ゲージが空のときにそこを透けさせて背景を表示できない

それを解消しつつ、もっと簡単に実現できる方法があったので備忘メモ。

やることは、

・ドーナツ状ゲージの「1度」分のゲージをつくる
・それを360個コピーして円状に並べる

これだけです。

前回の画像を編集して、1度分のゲージにします(赤枠で囲ったところ)↓
20130112circle_graph015.png

前回の画像を編集して使いまわしているので、Pivot位置も「Right」のままです。
この小さい画像用にSpriteの縦横幅を小さくしたりPivot位置を変えたりはしません。
変えてしまうと、回転させてもドーナツ状になりません。

これを360個円状に手で並べるのは大変なので、「プレファブにしてプログラムで一気に並べる」方法をとります。

Hierarchyウィンドウでいうと、「PowerGage」の直下に360個を置きます↓
20130112circle_graph016.png


そのプログラムです。
Test.js
---------------------------------------------
var prfb : GameObject; // ここにプレファブ化した「1度分」のSprite画像を読み込む
private static var num : int; // ゲージ管理用番号
function Start () {
num = 0;
var obj : GameObject;
for (var i : int = 0; i < 360; i++) {
// インスタンスを生成
obj = Instantiate(prfb, Vector3(0, 0, 0), Quaternion.identity);
// 親子関係
obj.transform.parent = GameObject.Find("PowerGage").transform;
// リサイズ(オリジナルサイズに)
obj.transform.localScale = Vector3(160, 320, 1);
// 位置
obj.transform.localPosition = Vector3.zero;
// 回転
obj.transform.localEulerAngles.z = i;

// 番号を振り当てる
obj.GetComponent(OneDegree_Controller).SetNum(i);
}
}
function Update() {
// ゲージを増やしていく
if (num < 360) {
num++;
}
}
static function GetNum() : int{
return num;
}
---------------------------------------------

赤で記述したところが、インスタンスを生成して円状に並べているところです。
その他については、これから説明します。

さて、赤い箇所の部分だけで円状に並べることはできましたが、それではただの円。
ゲージとしては機能しません。
そこで、「num」という変数の0〜359の値に合わせてゲージが増減する仕組みを入れます。
それが上記の Update() の部分です。

次に「1度分のゲージ」のインスタンスそれぞれに、0〜359の数値を順番に割り振ります。
あとは、「Test.jsのnum」と各ゲージに与えられた数字とを比較して、

・自分に与えられた数値よりもnumの方が大きいならば自分のゲージを表示
・そうじゃなかったら、自分のゲージは非表示

という条件をつければ完成です。

「1度分のゲージ」に使うSprite画像のプレファブに適用したスクリプトです↓

OneDegree_Controller.js
---------------------------------------------
private var num : int; // 割り振られる番号
private var wg : UIWidget; // 表示/非表示で使用
function Start() {
wg = this.GetComponent(UIWidget);
}
function SetNum(input : int) {
num = input;
}
function Update() {
// 自分の番号以上だったら表示
if (Test.GetNum() >= num) {
wg.color.a = 1;
} else {
wg.color.a = 0;
}
}
---------------------------------------------
それでは、実行してみます。
20130112circle_graph017.png

成功しました。
各インスタンスが「PowerGage」以下に生成されています。

こっちの方がスッキリして良さげです。
posted by be-style at 01:22| Comment(2) | Unity