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

あたらしものずきっ!

試してみたものとか、遊んでみたものを色々記してみます。

Unityにおける日本語表示にかんするえとせとら

Unityにおける2D表現ってのは鬼門で、そこに文字の表現が加わると尚更厄介なものです。Unity自体の操作に熟知していない場合等は、ゲームオブジェクトを只管くっつけて文字っぽく見せたり等もありますが、正直スマートではないです。

日本語のスマートな表示を行う場合、以下の2パターンが考えられます。

  • UI系Assetからラベルなどを使う
  • UnityからiPhoneのネイティブコードを実行する

UI系Assetからラベルなどを使う

Asset StoreにはUI作成に欠く事ができないAssetが山ほど存在しており、これを巧く利用すると文字の表現もあっさりとうまくいきます。ただし、UI系Assetでの文字表現にはビットマップ化したフォントが必要になります。

ビットマップ化フォント作成ツールにも幾つかありますが、フリーな作成ツールとしてはJava製でHieroというものがあります。が、どうもバグなのか正常に動作しなくなっています。代わりにUI系AssetへのGoodな対応やら処理中に落ちたりしないという点をとって、GlyphDesignerを現在愛用しています。

そして、作成したビットマップ化フォントを使うためのUI系Assetですが、最近流行のNGUIは一押しです。ドロー系ソフトの感覚でボタンなどのサイズ・色等の調整ができます。ただ、このAssetが要求してくるHierarchy構成が少々変わり物で、すでにHierarchy構成がかっちり固まっている場合はそれなりに手間が発生してくる可能性もあり。

UnityからiPhoneのネイティブコードを実行する

iOSのUIKitを利用して日本語表示を行います。iPhoneなどで入力出来る文字が全て使えるため、多国語言語表示対応等で使える文字数に制限を入れたくない場合は必須になります。

実行に当たっては、

  • ネイティブコードを書いたファイル
  • ネイティブコードをUnityから呼び出すための関数を定義してあるファイル

の二つが最低限必須です。

ファイルを作成してみると分かると思いますが、実行すると Unity側レイヤ ・ UIKit側レイヤ という2つのレイヤー構成が出来上がります。ゲーム処理はUnity側のみ、UIもとい文字はUIKit側のみで扱われ、Unityからの命令が自動でUIKit側へ飛ぶことはありません(逆もしかり)。UIKit側でUnity側からの命令を個別対応するための処理を、独自に作成する必要がでてくるわけです(これまた逆もしかり)。そして、Unity側とUIKit側が自動で連携していない結果、単純にシーン遷移をするととても残念なことになります。

全ての文字表現がUIKitで出来ればそれがベストなのですが、手間を考えるとピンポイントで使うのが一番です。また、この方法はUnity側のAssetでの影響をそこまで受けません。利用範囲を狭めればプロジェクト構成が固まった後からでも導入はしやすいかもしれません。

ゲームクリエイターはじめました

2月からこんなことはじめました。
新しい職場はこんな感じになっています。
どんな職場なのかは、この記事を読むと分かります。

いきさつ

前会社でソーシャゲーの開発に携わった結果に面白いiPhoneネイティブアプリのゲームを作りたいという欲がでたことと、auでiPhone4Sがでたんだからそろそろだよなーという思いがありました。android体制に固まりつつあった前会社を退職し、さてどうするかというタイミングでこの記事が上がって、これはいくしかないな、と。

IRCを全然使わなくなって且つ対面会話ベースになり、気持ちもリフレッシュできてる感じです。UnityとcocosというiPhoneゲーム最前線的なノリですが、Web系で培った知識等を活かしつつ、面白いゲームを早くリリースできればと思います。

Amon2::Lite + dotcloudな開発の今のところメモ

時間があるうちに、色々ためてたものを一気に作ってしまうのと、なるだけお金を使わない生活ということで只管コードを書いてます。

わりとハマりがちかなーと思える部分と、ちょっとゴージャスに作り込みをした部分を、自分用メモ兼ねて。

403ページを贅沢にする

ナビゲーションを入れたかったのでテコ入れ。

# load plugins
__PACKAGE__->load_plugin('Web::CSRFDefender', { no_validate_hook => 1 });

__PACKAGE__->add_trigger(
    BEFORE_DISPATCH => sub {
        my $c = shift;
        if (not $c->validate_csrf()) {
            my $contents = $c->render('session_lost.html')->body;
            return $c->create_response(
                403,
                [
                    'Content-Type'   => 'text/html',
                    'Content-Length' => length($contents),
                ],
                $contents
            );
        } else {
            return;
        }
    }
);

Amon2::Plugin::Web::CSRFDefenderにno_validate_hookを渡して、デフォルトで実行される403ページ生成部分を飛ばす。あとはapp.psgiに403ページ生成処理を差し込むだけ。

session storeを変える

Dotcloudのsessionが頻繁に切れてしまう場合の対応。

__PACKAGE__->enable_session( store => 'File' );

sessionが頻繁に切れてcsrf_tokenが常時空に近い状態になり、フォーム入力がままならなかったのが、これで緩和。

文字コード指定

typoなのか、この形に簡略表記できるのか、はっきりとは分からなかったので蛇足かもしれない。

- <met charst="utf-8">
+ <meta charset="utf-8">

こうすると、文字化けするケースに対応できた。

Amon2::Lite (0.07)にて、post(あるいはget)が405 Method Not Allowedになるケース

自分のやり方が希有なケースなのかもしれないのと、pathを書き換えれば即対応もできる、という前提で。

今確認している限りだと、一つのPathでgetとpostの両方の処理を書くと、後に書いた方がうまくmatchされないという状態になっている。

131         if (my $p = $router->match($c->request->env)) {
132             if ($p->{method}) { 
133                 for my $method ( @{ $p->{method} } ) {
134                     if ( $method eq $c->request->env->{REQUEST_METHOD} ) {
135                         return $p->{code}->( $c, $p );
136                     } 
137                 }
138             } else {
139                 return $p->{code}->( $c, $p );
140             } 
141             my $content = '405 Method Not Allowed';
142             return $c->create_response(
143                 405,
144                 [
145                     'Content-Type'   => 'text/plain; charset=utf-8',
146                     'Content-Length' => length($content),
147                 ],
148                 [$content]
149             );

app.psgiで、

get '/login'  => sub { shift->render('login.html') };

post '/login' => sub { 
     my $c = shift;
     ...
};

としたうえで/loginに対してpostリクエストを送り、132行目の$pをDumpさせると

$VAR1 = { 
          'method' => [ 
                        'GET',
                        'HEAD'
                      ],
          'code' => sub { "DUMMY" }
        };

となる。

修正をかけるにしても、Router::Simpleのほうにmethodも確認するようにpatchをあてないとダメな気がしつつ、なんかめんどくさいのでpathを変更する形でapp.psgiを修正しちゃったほうが早い気もしつつ…。

只今のモバマス模様

f:id:hao_yayoi:20120103222918j:image
mobageアイマススマートフォンにも対応された、というtweetを見て開始。

チーム編成

現在38lv。雪歩・美希・伊織が主力で、スキマをオリジナルキャラが埋めているという状態。雪歩+伊織+無料ガチャでは少々心もとないチーム編成だったので、オープン時にやっていた1500コインの特別ガチャを一度だけ回して美希を増員。2回以上回したら無料ガチャの効果が薄れると感じてセーブ。

進め具合

イベントをこなしたり、ランキングに地味に入ったりしたお陰で、レッスン(合成)に著しい効果をもたらすキャラが複数もらえてる。貰いすぎて手元に収めるには溢れてしまうので、まだギフトから全部は受け取ってない。

同じような有料ガチャ等を控えているプレイヤーとは割と遊べている感じ。ガチャ漬けになっているユーザのチーム編成が露骨にパワープレイすぎて、ちょっと引くこともある。

ローコストでの運用

基本的に、チーム編成に使えるポイント内で、

  • 「攻撃力あるいは防御力 / コスト」のコスト対能力値が高いキャラ

あるいは

  • コスト対能力値がある程度低くても、特技をもっているキャラ

をメインにチームを組むわけだけど、そうそうレアが手に入ることはないため自然と前者前提になる。

同じアイドルを特訓(合成)すると各能力が大幅に上昇するものの、合成前の二人のアイドルの能力を高めておいた方が特訓後その分強化されるので、基本的に最大まで強化しつくしてから特訓というプレイスタイル。もちろん親愛度はMAX。

手に入るアイドルが多種多様なので目移りしてしまうのだけれど、コストが6〜10くらいのアイドルをフロントメンバーに置く形にすれば、ある程度は無料プレイ中心でも底上げは可能。細かい数値の違いとかで割と迷いそうになるけれど、実際にはスキルやら属性やらの補正で、割と細かい部分は無視してもかまわないくらいの状態になるので、アイドルの好みが決め手になる。

最初に決めるプレイヤー属性と合わないアイドルを取得した場合、レアならトレード要員として、それ以外は全部レッスン要員にしてしまう感じ。

対戦

プロダクションに入っていないプレイヤーはいい鴨になる。あと、劇団ひとりも。

基本的に高レベルプレイヤーは対戦相手から外すのだけれど、たまにレベルが高いわりに防御ポイントが低いプレイヤーもいるため(防御をすてて攻撃一択タイプ)、そういったのも合わせていくと勝率とランキングもそれなりに稼げる。

同レベル帯の平均的な育て方をしているプレイヤーに対戦ふっかけると割と高い確率で負けるので、防御ポイントとレベルをよく確認しないと黒星が蓄積されやすく、そこそこ負け上等プレイになりやすい。

まとめ

負けてもロストするものが少ない(人によっては全然痛くない)こともあって、無課金で負け上等プレイも割といける。勝ちを目指し始めると、恐らくきりがない。アイドルの編成をどうするか(メガネ'sとかお姉様軍団とか)ということのほうに夢中になるほうが幸せになれるかも。

2012年元旦

あけましておめでとうございます。
2012年は以下を目標に進めようと思います。

  • iPhoneアプリのリリース
  • 技術系のログを書く
  • 楽しんでいることについてなるだけ頻度を上げて書く
  • iPhoneアプリ開発系の勉強会になるだけ顔を出す
  • 北海道へ旅行に行く

転職活動は1月半ばに完了予定で、恐らく仕事初めは2月からになりそうです。

iOSアプリ開発者として就職活動をする場合にたしなんでおきたい6つの事

@TonnyXu さんから引き続き、iOS Advent Calendarの13日目となります。

iPhoneアプリ開発もといスマートフォンアプリ開発者として就職活動中の @haoyayoi です。iOSもといスマートフォンのアプリ開発で食っていくお仕事につきたい場合、事前にどれだけの内容について最低限たしなんでおけばよさそうか、6つほどピックアップしてみました。

1.iPhoneアプリを沢山作って申請しておこう

某転職サービスを利用して、サービス担当者とお話をして強く言われたのが、

「皆さん、iPhoneアプリ作れます、って言う割に、何を作ったんですか、ってきくと、口ごもるんですよね〜。」

一応数年前に一本、そして先日もう一本仕上げていた身だったので、「作ってないのに作れます、ってのは流石にないですよねー」とかえしたんですが、2本はやっぱり少ないなと自分でも思うところです。(1年6ヶ月程はLL及びサーバの知識を付けるのに精一杯だった、とか泣き言ですね、はい。)

2.githubにアカウントをつくって利用しておこう

某転職サービスの担当者から更に言われた事が、

「つくっていらっしゃるんですね!ではソースコードとか拝見させていただけますか?」

さすがに有料アプリのソースコードを積極的に公開する人はそうは居ないと思うんです、はい。

また、某らいおんなiPhoneアプリのこともあって、projectを丸ごとアップするのには抵抗ある開発者の方もそこそこいるはず。なので、何か小さめなサンプルプロジェクトを公開するのも手かもしれません。もしくはgistとか。

3.Linuxコマンドラインになれておこう

とはいえ、ボリュームがあることも確かです。とりあえず git に慣れておくことは大事だと思われます。「Xcodeからじゃないとgit触れません(テヘ」なんて口にしたら、空気が固まる可能性もあります。

あたりをたしなんでおくと、さらに色々と頼れる人材になるかもしれません。

4.サードパーティフレームワークにもなれておこう

今日では、

などがありますね。

Androidアプリを手がける手段にもなるので、開発領域が広がる点では強力な一手だと思われます。

5.サーバにも慣れておこう

サーバ上でWebAPIを作れるようになれば、iPhoneからサーバを通して色々なアクションがとれるようにもなります。LLを覚える必要もありますが、Objective-Cを覚えられたのだから大した労力でもないでしょう。

レンタルサーバとしては、

など、他にもいくつかありますが、とりあえずはお金そこまで掛からない場所を選びたいところです。

WebAPIの開発言語としては、

などありますが、php覚えればとりあえずは色々大丈夫だと思います。

MySQLも操作できるようになっておくとなおよしです。

また、iPhoneアプリのサポート用ページをCGIなどで書き直してみるのも手ですね。

6.javaも覚えてみよう

Android開発にも思い切って取り組んでみましょう。「も」というにはボリューム感は若干ありますが、Titanium Mobileなどではキャッチしづらいディープな部分も掴めるようになるはずです。Eclipseの操作に馴染む必要もありますが、Xcodeに馴染んでいるのなら大した問題ではないでしょう。ただ、実機確認という点が厳しいかもしれません。

まとめ

6つほどピックアップしてみました。いかがでしたでしょうか。

なお、世の中

  • iPhoneネイティブアプリ開発者として採用されたのに、サーバ上でLL触る仕事ばかり任されてobjc全然触れなかった
  • AndroidとiOSのネイティブアプリ開発なんてやってる内容は同じもんだとしてプロジェクトを任された上で、仕様がネイティブ機能ガン無視で、最終的に炎上して焼結した。
  • ネイティブのUIとか画面なんて全部html5で置き換えられるだろうと主張されて、ネイティブにタッチできない

なんてことはよくあります。

ネイティブアプリ開発について、スマートフォンの特性及び操作体験について、きちんと理解している会社に就職したいものですね。

明日は @kaz_29 さんです。