目がやばい

 昨日、不慮のアクシデントで右目の視力がほとんど無くなった。
リアルにムスカのようなリアクションをとってしまった。
今は痛みはかなり引いたが視力は戻らず。。眼科に行ってこよう。

視力は戻るんだろうか。。すごく不安だ。

Unity開発メモ:文字列のフォーマット

 時分のフォーマットはこんな感じ。初めて見た。
String.Format("{0:00}:{1:00}", hour, minute);

というか、このあたりは Unity というより .NET Framework の勉強だな。

Unity開発メモ:時刻の保存

 現在時刻を保存するメモ。
DateTime.Now.Ticksで"12:00:00 01/01/0001"からの経過秒をlong型で取得できる。PlayerPrefs.SetIntだと桁溢れするため、これをStringで保存する。
復元はConvert.ToInt64でlong型に戻してDateTimeのコンストラクタに渡す。

【保存】
var ticks : long = DateTime.Now.Ticks;
PlayerPrefs.SetString("datetime", ticks.ToString());
PlayerPrefs.Save();

【復元】
var dateString : String = PlayerPrefs.GetString("datetime");
var ticks : long = Convert.ToInt64(dateString);
print(new DateTime(ticks));

なお、日付型のSystem.DateTimeはデフォルトでは使えないので、コードの先頭に
import System; が必要。

また、時刻の差分(秒)は、このように求める。
var diff : long = (newTicks - oldTicks) / (1000 * 1000 * 10);
(Ticksは100ナノ秒)

Unity開発メモ:iPhone解像度

 iPhoneでの性能調査のため、とあるシーン(3000ポリゴン程度、物理演算を使用)のフレームレートを測ってみた。

iPhone3GS (fog有)60 fps
iPhone4 (fog有、retina)38 fps
iPhone4 (fog無、retina)48 fps
iPhone4S (fog有、retina)60 fps
iPad (fog有)33 fps
iPad (fog有)42 fps
iPad2 (fog有、AAx2)60 fps
new iPad (fog有、retina)60 fps

iPhone4とiPadがやけに遅い。iPadはともかく、iPhone4は何とか60fpsを実現したい。
一番手っ取り早い方法はレンダリング解像度を320x480に下げること。

まずは、Unityの標準クラス Screen のメソッドを使ってみた。
Screen.SetResolution (320, 480, true);
これは表示がおかしくなってうまくいかなかった。

次に iOS PlayerSetting の Target Resolution の設定。
・Native(Default Device Resolution)
・Standard(Medium or Low Resolution)
・HD(Highest available resolution)
"Standard"にすると解像度が下がるが、iPhone4やnew iPadも影響を受けるようだ。

ネットで調べるとやっと解決策が見つかった。
Unityから生成されるiOSコードを以下のような感じで変更すれば、端末ごとにRetinaかSDの制御が可能になるようだ。さらに、scaleFactor を 0.5 とかに設定することでもっと解像度を下げることも可能なので、iPadの高速化も見込めそうだ。

AppController.mm
bool CreateSurface(EAGLView *view, EAGLSurfaceDesc* surface)
{
CAEAGLLayer* eaglLayer = (CAEAGLLayer*)surface->eaglLayer;
assert(eaglLayer == [view layer]);

CGSize newSize = [eaglLayer bounds].size;
newSize.width  = roundf(newSize.width);
newSize.height = roundf(newSize.height);

#ifdef __IPHONE_4_0
    int resolution = UnityGetTargetResolution();

    if (    (resolution == kTargetResolutionNative || resolution == kTargetResolutionHD)
    && [view respondsToSelector:@selector(setContentScaleFactor:)]
    && [[UIScreen mainScreen] respondsToSelector:@selector(scale)]
       )
    {
CGFloat scaleFactor = [UIScreen mainScreen].scale;
struct utsname u;
uname(&u);
NSString* machine = [[[NSString alloc] initWithUTF8String:u.machine] autorelease];
if ([machine isEqualToString:@"iPhone3,1"] ||
[machine isEqualToString:@"iPod4,1"]) {
scaleFactor = 1.0f;
}
[view setContentScaleFactor:scaleFactor];
newSize.width = roundf(newSize.width * scaleFactor);
newSize.height = roundf(newSize.height * scaleFactor);
UnitySetInputScaleFactor(scaleFactor);
    }
#endif

surface->w = newSize.width;
surface->h = newSize.height;

UNITY_DBG_LOG ("CreateWindowSurface: FBO¥n");
CreateSurfaceGLES(surface);
GLES_CHK( glBindRenderbufferOES(GL_RENDERBUFFER_OES, surface->renderbuffer) );

return true;
}

結果として、iPhone4でも 60fps を実現することが出来た。
iPhone4 (fog有、AAx2)60 fps

Retina表示より質は劣るが、AAをかけても高いfpsを維持できるので、アプリの方向性によっては十分良い方法だと思う。

Unity開発メモ:GemShader

 宝石のようなレンダリングができるフリーのAsset「GemShader」。
cubemapが何たらとかで、そのままではiPhoneで動作しないようだ。
PCでは動作するのにiPhoneで動かなくてガックリ、というパターンがきつい。


Unity開発メモ:GameObject.Find()

 GameObjectの参照でハマってしまった。
階層構造になっているオブジェクトを作って、その親側のスクリプトの中でインスタンスメソッドのように gameObject.Find("childとか") を実行すると、当然その配下の子オブジェクトの参照を取得できると思っていた。でもFindはクラスメソッドなので、同一名称のオブジェクトが他にある場合はそうならない。よく考えると当たり前なのに今まで全く気づかなかった・・。


JAXA

 「宇宙兄弟」に影響されて、JAXAの筑波宇宙センターに行ってきた。
展示館で巨大な衛星や宇宙ステーションを見学、ショップで宇宙食を購入。
最後に実物大H-IIロケットを見た。久しぶりにワクワクした。


iMemoryGraphをアップデート

 かなり久しぶりの投稿です。

iMemoryGraphをアップデートしました。
  04/04 : Retina用に画像を更新。新しいiPadに対応。
  04/27 : URLスキームに対応。

URLスキームについては、こちらのブログを読むとよく分かります。

スケジュール化など便利な使い方があるのは知りませんでした。
取り上げて頂いてありがとうございます!

アプリのiOS5対応について

 いくつかのアプリで、iOS5上での不具合が確認されています。
・iMemoryGraph:開放時に落ちやすい
・PhotoAlbum/GeotagEditor:写真が表示されない
・その他:検証中

現在、調査/修正の作業を行っております。
大変申し訳ありませんが、アップデートまで暫くお待ちください。

<2011/10/15追記>
・iMemoryGraph:修正版を申請中
・GeotagEditor:修正版を申請中

<2011/10/16追記>
・PhotoAlbum:修正版を申請中

ガンダムエリアウォーズ

 iPhoneの無料アプリ「ガンダムエリアウォーズ」が面白い。

ゲームと言っても、ただボタンを押すだけでアクション性も戦略性も皆無。いわゆるソーシャルゲーム。しかしツボをよく心得ていて、ついつい起動して遊んでしまう。昨今のソーシャルゲームの人気が少し理解できた気がする。

・・のだけど、幸か不幸か不具合が非常に多いので、課金するまでには至っていない。(運良くガンダム、ガンキャノンをゲットできたし。。)


calendar
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< May 2012 >>
selected entries
categories
archives
recent comment
others
mobile
qrcode