あたらしものずきっ!

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

無尽蔵の天質を入手

ダスティトークンの到達報酬を全入手完了。空飛び放題。

明らかにGW後から入手個数にブーストが掛かってる感じはあったけど、オフライン中心のオンライン交流的なタイトルで、遊び始める時期が後になるほど到達し難くなるコンテンツだから、これくらいが丁度いいのかもしれない。

https://www.instagram.com/p/BUeeHD1l71r/

フォトレビューにて一枚の写真を複数人から評価されたり、トレジャーハントも一つのハント報告を元に複数人がチャレンジしたりと、一度のチャレンジで複数回トークンが手に入る仕組みではあるものの、時間が経つと頻度はやはり落ち気味。

フォトレビューの場所はプレイヤーの撮影した場所次第だけれど、トレジャーハントは見つけやすいハント報告が延々とプレイヤー間で巡回しているようで、同じようなトレハンばかり発生してる気がする。

プレジューヌの駅ホーム下のトレジャーなんて何回廻ってきたことか。そしてたまに舞い込むレイ・エルゴーナのトレジャーが未だ苦痛でしかない。ヘキサヴィルのトレジャーが明らかに少なく感じるのは、新天地で上下にも広いジルガ・パラ・ラオの方が探索で楽しめるということなのかも。

トークン総取得量上位プレイヤーのモチベーションがどこらへんにあるのかは気になるところ。無尽蔵の天質自体は6000ボーダーで、1位が278000。そして1位は2位に対して大体ダブルスコア。各チャレンジミッションのトップがこの1位の人だから、明らかにやり込みの人らしい。

DLCの追加も終わったこともあり、後はジェムでのステータス強化とトロフィーコンプのみに。とはいえ、此処からが長い。レアネヴィに至っては未だ1体も狩ってない。

書籍とサントラは発売済みで、夏にはfigma。丁度スプラトゥーン2と重なるタイミングだけど、無印から延々と楽しんできたわけだし、このくらいで丁度いいのかもしれない。

Gargronを支援する方法

Mastodonでハッスルしてる人達を見てると、作者のGargronを完全スルーしてるように感じたので、支援の背中押しとして手続きのようなものをまとめておくことにした。

Patreonによる現金投資

製作者への直接投げ銭。支払い方法はクレジットカードかPaypalPaypal経由でもクレジットカードになることは変わりなし。アカウント登録にはFacebookアカウントも使える。

appsto.re

投資額は1ドル・10ドル・20ドル・40ドルの4つから。一回切りではなく月額。複数の支払いを組み合わせることも可能。

支援特典

Discord上のDeveloperチャンネルに参加できる。Gargron自身も参加しているため、インスタンス運営を行ってる人には特におすすめ。予め断っておくことがあるとすれば、チャンネル上でのコンタクトは英語ベース。

40ドル投資のみカスタマーサポートが含まれるためか、人数制限がある。問題は日本語によるサポートのやり取りがおそらく不可能なところ。

githubでのPull-Request

現在は日本語への翻訳内容が適切かどうか凄く怪しい状態。法務的なものも絡みそうなため、当の日本人ですら判断し難い。エンジニアリングで変なコードを混ぜるPRを送られるよりも有識者が翻訳の修正をしたほうが色々な方面から喜ばれる。

PRを送るとTravis CIがテストを行い、問題なければcontributorが内容を確認。問題なければGargronがmasterにmergeしていく。

Mastodonが活発化したこともあり、Gargronの生活サイクルがどうみてもやばい(早死にしそうだなってくらい)ので、エンジニアリングと翻訳共に自信がないならPatreonでの寄付の方がマシな気はする。

私的な感想

Patreonでの寄付は1ドルでもgithubに名前を記録してくれるくらいに律儀なので、誰が実際に支援してるのかすぐにわかる形。自分自身も1ドルでの月額設定済み。

プログラム触れないからって単に色々騒ぐよりも、投げ銭する方が好印象ではある。

クロウの帰結に苦労した話

ゴールデンウィーク中にクリアする筈だった、Gravity Daze2 追加DLC「クロウの帰結」をようやくクリア。

事前情報を触っていた時点で相当難易度高そうだなとは思っていたものの、まさかイージーモードでゲームオーバーの連続になるとは予想できなかった。
https://www.instagram.com/p/BUCiV1blgtP/
DLCクリア記念

本編で色々触れられてなかったことも分かったような気がしつつも未だ時間軸が色々と謎なまま。ただ、電撃PSのインタビュー見るにそこらへんをあえて明確にしていないらしい。
サチアの出自は今後も語り草になりそう。

トロフィー未完だし、ダスティトークンも「ジェスチャー ビシッ!」までしか到達していないので、まだまだ遊ぶ余地あり。

サントラと攻略本は買ったものの、アートブックを買ってなかった。Figmaは注文時期過ぎてたので尼で割高な選択肢を選んだところ。

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を修正しちゃったほうが早い気もしつつ…。