NECO のすべての投稿

Unityでのダウンロードを高速化するアセットの販売をはじめました!

Unityのゲームを作っていて、ダウンロード速度が思ったほど出ないと感じること、ありませんか?

例えば以下のようなケース
■シナリオの進み具合に応じて登場するキャラクターが、衣装や装備品を身につけていて、新しいキャラクターが出てくるたびにダウンロードが発生!
■育成画面でユーザーごとに保有するカードを 種類数分表示するようになってて、スクロールするたびにダウンロードが発生!
■10連ガチャをまわして、出た内容に応じてダウンロードが発生!

通信環境が悪いと結構な頻度でユーザーに待ち時間を発生させてしまいます……
そんなUnityでも、極力シンプルにダウンロードを高速化するアセットを作りました!!

[[ Simple H2 downloader – Unity Asset Store ]]
https://assetstore.unity.com/packages/tools/network/simpleh2downloader-173745

このアセット、Unityが使っている通信機能(WWW、UnityWebRequest)を使わず、代わりに最新の通信プロトコルで実装された通信機能によってダウンロードすることで、高速化を図っています。

Unityの通信機能では、HTTPバージョン1.1(以下、HTTP1)までしか使えません。この HTTP1 では、1回の通信で同時に1つしかダウンロードできないため、複数ダウンロードを並行で行うにはそれなりのマシンパワーが必要になります。また HTTP1 自体の仕様が古く(1995年制定)、テキスト解析にも比較的高いマシンパワー使います。スマホだけでなくサーバーの負荷も高いため、みだりに並行数を増やすことはマナー違反とされています。他にも通信を開始するための準備(DNS解決、暗号方式の擦り合わせ、暗号鍵の生成)も遅いです。もちろんそれらを動かすにはそれなりに複雑な実装が必要になります。

一方、このアセットでは内部で用いる通信プロトコルとして、HTTPバージョン2(以下、HTTP2)を使っています。
こちらを使うことで、1回の通信がさらに細かく制御できるようになり並行して取得できるようになってます、しかも従来の1つ分のマシンパワーで。また マシン負荷が低く抑えられるような工夫が HTTP2 に盛り込まれており、省電力でハイパフォーマンスなダウンロードが行えるプロトコルということもあり、今回採用に至りました。

余談ですが、Webページを表示するブラウザ(ChromeやMicrosoftEdge)では、当たり前のように使われている通信プロトコルがHTTP2なのですが、Unityでも使えるようになるのは、もう数年かかりそうとのこと……
参考:  [[ .NET Standard 2.1 platform support #1330 ]]
https://github.com/dotnet/standard/issues/1330#issuecomment-510495179

ということで、興味を持たれた方は、Unityアセットストアへどうぞ。
速度比較の参考動画もアップロードしてます。

[[ Simple H2 downloader – Unity Asset Store ]]
https://assetstore.unity.com/packages/tools/network/simpleh2downloader-173745

iPhoneプッシュ通知(APNs)の証明書を作る

iPhoneアプリでプッシュ通知するには、
対象のアプリのプッシュ通知証明書を毎年更新する必要がある。
Appleから取得できる証明書は「.cer」だが、サーバーで使うのは「.pem」なので、変換が必要になる。
やりかたを毎回忘れるのでその時に備えたメモ。

事前に済ませておくこと
・鍵ペアを作成する
・証明書の作成に必要な証明書署名要求を作る
・iOS Dev Centerで証明書を作成する
・キーチェーンアクセスに証明書を登録する

以下の手順でやる

・キーチェーンアクセスから証明書と秘密鍵の書き出しを行う
『証明書』からプッシュ通知用の証明書を右クリックして書き出す
apns1

ファイル名は「apns-dev.crt.p12」で保存
apns2

パスワード入力画面では、便宜上、空欄のままOKを押す
apns3

証明書に紐づく秘密鍵を右クリックして書き出す
apns4

ファイル名は「apns-dev.key.p12」で保存
apns5

パスワード入力画面では、便宜上、空欄のままOKを押す
apns6

証明書をPKCS12形式からPEM形式に変換する

cat apns-dev.crt.p12 | openssl pkcs12 -passin pass: -clcerts -nokeys > apns-dev.crt.pem

秘密鍵をPKCS12形式からパスワード付きのPEM形式に変換する(空パスワードは指定できない)

cat apns-dev.key.p12 | openssl pkcs12 -passin pass: -passout pass:PASS -nocerts > apns-dev-with-password.key.pem

秘密鍵からパスワードを除去する

cat apns-dev-with-password.key.pem | openssl rsa -passin pass:PASS > apns-dev.key.pem

証明書と秘密鍵を合成する

cat apns-dev.crt.pem apns-dev.key.pem > apns-dev.crt+key.pem

2015.9.6
NECO

cocos2d-xでゲーム画面を縦に変更

よく忘れるので、備忘録も兼ねてメモ

cocos2d-xでアプリを作る際、初期設定は横向きになっている。
iPhoneで縦画面としてレイアウトするには、以下のように行う。

(1) xcodeのナビゲータエリアから、xcodeプロジェクトファイルを選択し、エディタエリアからGeneral > Deployment Info > Device Orientation から、Portrait のみチェックを入れる。

layout

(2) $PROJ_ROOT/proj.ios_mac/ios/RootViewController.mmの
shouldAutorotateToInterfaceOrientationメソッドの戻り値を下記のように書き換える。

// Override to allow orientations other than the default portrait orientation.
// This method is deprecated on ios6
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return UIInterfaceOrientationIsPortrait( interfaceOrientation );
}

これにより、iPhoneで縦向きで表示される。

layout_portrait

ちなみに、macでも縦向きで表示するには、以下のファイルを編集する。試してないけどwindowsでもイケるはず。
$PROJ_ROOT/cocos2d/cocos/platform/desktop/CCGLViewImpl-desktop.cpp

GLViewImpl* GLViewImpl::create(const std::string& viewName)
{
    auto ret = new (std::nothrow) GLViewImpl;
//  if(ret && ret->initWithRect(viewName, Rect(0, 0, 960, 640), 1)) {
    if(ret && ret->initWithRect(viewName, Rect(0, 0, 320, 568), 1)) {
        ret->autorelease();
        return ret;
    }

    return nullptr;
}

これにより、macでも縦向きになる。

layout_portrait_mac

解像度がまちまちだったりとか、いろいろ問題もあるけど、
まずは縦画面にできた。

cocos2d-xでプロジェクトを作成

Mac環境での作業を想定。
事前にxcodeとpythonのインストールを済ませておく。

cocos2d-xのダウンロード
http://cocos2d-x.org/download

cocos2d-x-3.3.zipを任意のフォルダに展開

セットアップ
setup.py

新規プロジェクトの作成
cocos new [ゲーム名] -p [パッケージ名] -l cpp -d .

ビルドと実行
cocos run -p ios
cocos run -p android

ビルドが成功すれば、iOSシミュレータが起動し、アプリが起動する。
hello_cocos

その他のコマンドはヘルプを参照
cocos -help