やめアプ

会社をやめてアプリ開発者となった筆者の日常を書き連ねていきます。

【Unity】課金機能を導入〜プラグイン選定編〜

Unity自体はApp Store/Google Play向けの課金機能を提供していません。よって、課金入りのアプリを開発したい場合は、自前で実装するかサードパーティ製のプラグインを使用する必要があります。

私はプラグインを使用したのですが、調べてみても意外に情報が少なく、「どれが定番のプラグインか?」もなかなか分からず苦労しました。今日はそのあたりの情報をまとめたいと思います。

なお、価格などの各種情報は2015年8月30日現在のものです。

 

【prime31】

Asset Storeで販売されている有料プラグイン。prime31というのはパブリッシャー名です。『iOS StoreKit In App Purchase Plugin』『Android In App Billing Plugin』 が別売りされていて、各$70。Unityユーザーの中では定番課金プラグインの1つのようで、その安心感から私もこれを選択しました。日本語の解説ブログもそこそこありますし、シンプルなのでサンプルソースを見るだけもほぼ実装できます。

 

【Unibill】

こちらもAsset Storeで販売されている有料プラグインApp StoreGoogle Playだけでなく、Amazonアプリストア等にも対応したオールインワンパッケージになっています。価格は$175。こちらもprime31と双璧をなす定番課金プラグイン……のようだったのですが、なんと現在Asset Storeから購入できなくなっております……! 一時的なものなのか、販売終了してしまったのかは不明です。prime31を2つ買うより割高ですが、Amazonアプリストアにも公開したい人には良い選択肢になる……と思っていたんですけれど。

 

【SOOM.LA】

無料プラグインといえばこれが定番のようです。iOS/Android両対応。SOOM.LAというのはやはりパブリッシャー名です。日本語の情報は少なめですが、利用者は多く実績もある模様。課金機能単体のプラグインというより、ゲーム内でのアイテム管理システムも含めた総合パッケージという感じらしいです。ちゃんと使いこなせば便利そうですが、シンプルに課金機能だけを導入したい場合には煩雑な印象でした。

 

【appC cloud】

広告SDKに各種便利機能がついており、その中の1つとして課金機能があります。日本のサービスですしチュートリアルも充実。導入実績も多そうです。ただしアイテム購入画面のUIがある程度決まっており、100%自由にはできないのがネックです。有名アプリ『おじぽっくる』で導入されているので、課金画面を確かめてみるとよくわかります。

 

以上となります。

有料でも良いから簡単・確実に導入したいのであればprime31はおすすめできます。無料にこだわるならSOOM.LA、日本語にこだわるならappC cloud、という感じでしょうか。

もちろん他にも選択肢はありますが、定番どころならこの中から選べば間違いないと思います。

 

prime31での実装方法についてはまたいずれまとめるかもしれません。

誰でもできる! 短縮URLの機能を利用してヒットアプリのSNSシェア効果を分析する方法

はじめに

「goo.gl」や「bit.ly」などの短縮URLはお使いでしょうか。

アプリ開発者の方でしたら、アプリ内からSNSシェアしてもらうときの文章内に利用していることが多いのではないでしょうか。

「goo.gl」や「bit.ly」は強力なアクセス解析機能が付いていることでも有名です。そしてこの解析機能、実は「誰でも」見られることはご存知でしょうか? 今日はこの機能を利用して有名アプリのSNSシェア効果を分析する方法をご紹介します。

 

どうやって見るの?

それでは実際に試してみましょう。今回はiOSで7月にリリースされた『breaker』というブロック崩しアプリで試してみます。

まずはアプリ内のSNSシェア機能を利用して、使用されている短縮URLを調べます。

f:id:moshimobox:20150826211631p:plain 

そして、その短縮URL末尾に「+」を付けるだけ!

f:id:moshimobox:20150826212028p:plain

これだけでアクセス解析画面が見られます。この方法は「goo.gl」も「bit.ly」も同じです。

 

アクセス解析画面

これは「bit.ly」のものです。「bit.ly」はログインしないと詳細情報が見られませんが、ログインさえすれば誰でも詳細情報を見られます。 

f:id:moshimobox:20150826211455p:plainこれまでにSNSシェア経由のクリックが約15,000あったことがわかります。『breaker』のiOS版の正確なDL数は不明ですが、「iOS / Android合わせて60万DL超」「無料総合ランキングで10位以内に10日間、5位以内に8日間ランクインしていた」というヒットアプリ。その規模感からいくと、15,000クリックというのは若干少なめにも思えますが、このアプリでは露骨なシェア誘導を行っていないためかもしれません。

 

f:id:moshimobox:20150826211530p:plain

クリック元についても情報がわかります。10,000クリック超のTwitterが圧倒的ですね。『breaker』ではゲームオーバー時にTwitterFacebookのシェアボタンが並んで表示されますが、Facebookでのシェアはほとんどされなかったようです。

Twitterについてはツイート総数もわかります。breakerの場合は約3,300ツイート。1ツイートあたり平均3クリック獲得できたようです。また、どのツイート経由でどれくらいクリックされたかも一部わかります(Tweet Not Availableとなって情報を取得できないものも多いですが)。自分で利用する場合、シェア時の文言や画像を数パターン用意してどのクリックが多いかA/Bテストを行う、といった使い方もできそうですね。

 

f:id:moshimobox:20150826211551p:plain

地域ごとのクリック数ももちろんわかります。日本が大多数なのは当然として、第2位がスウェーデンというのは意外。

 

bit.lyのアクセス解析でわかるのは以上のような情報です。goo.glの場合はツイートの解析機能はありませんが、ブラウザやプラットフォームの解析機能が充実しています。iOS / Androidの比較なんかがしたければgoo.glを選ぶのが良さそうです。

 

おわりに

いかがでしたでしょうか。

今回見てみたのは1つのアプリのみですが、複数のヒットアプリの情報を見比べてみることで、どういったSNSシェアが効果的なのか分析できるのではないでしょうか。

他人のアクセス解析を覗き見る……と聞くと何やら後ろめたい気もしますが、これらはパブリックに公開されている情報です。安心してありがたく有効活用させていただきましょう。

と同時に、もしこういった情報を他者に見られたくない開発者の方は、「goo.gl」や「bit.ly」の使用には慎重になった方がよさそうですね。

カジュアルゲームに導入したUnityAds(動画広告)1ヶ月間の収益を公開

これから流行ると言われている動画広告ですが、まだ情報が圧倒的に少ないと感じています。どれくらいの収益が見込めるのか、どのアドネットワークが良いのか……等々、知りたいことは多々ありますが、具体的な情報がなかなか見つかりません。

 

私自身、いくつかのアプリにUnityAds(Unity社が運営する動画広告)を導入してみましたが、現在の収益が良いのか悪いのか、他にもっと良いアドネットワークがあるのかないのか、さっぱりわからない状態です。

 

そういった情報がもっとシェアされるようになればいいなという願いと、自分もその一助になれればという思いを込めて、今日は私のUnityAds収益データを公開したいと思います。

 

導入アプリはこちら。 

ドローン

ドローン

  • tack
  • ゲーム
  • 無料

ステージクリア型のカジュアルアクションゲームです。

ステージクリア/失敗時に、一定の確率で動画広告が強制的に再生されます。特にインセンティブはありません。再生から5秒経つと動画をスキップできるようになります。導入の仕方があまりイケていないのは自覚していますが、とりあえず動画広告というものをやってみたかったので半ば無理やり入れてみました。

 

7月中旬にリリースしてから1ヶ月強。その間のUnityAdsのデータは下記の通りです。

f:id:moshimobox:20150825065905p:plain

母数が少ないため、もろもろの値が小さいのはご容赦ください。

Game Sessionsが何を示しているのかはよくわかりませんが、再生開始が2382、再生完了が444、そして収益が$21.27となっています。

「1再生あたり1~2円の収益」と言われる動画広告ですが、このデータに限って言えば1再生(完了)あたり5円以上の収益が出ていることになりそうです($1=120円換算)。

 

(※追記。通常は「1再生『開始』あたり1〜2円」のことを言うらしく、上のデータは1再生開始あたり1円強なので妥当な収益性とのこと。@tatsuosakamotoさんに教えていただきました) 

 

しかしグラフからもおわかりの通り、収益がとても不安定です。8/10の収益がなければまったく違うデータになっていますし、この日の収益がたまたまなのか、「UnityAdsでは◯impまでレポートに反映されない」というやつが一気に反映された結果なのか、特別に単価の高い案件が配信されたのか、それもわかりません。再生回数が増えてくれば安定するものなのかも未知数です。

 

以上、カジュアルゲームに導入してみたUnityAds1ヶ月間のデータでした。まだまだわからないことだらけですが、動画広告はゲームシステムとの組み合わせを考えるのが面白いなと思っていますので、これからも積極的に導入していこうと考えています。

そして、もし知見をお持ちの方がいらっしゃいましたら、ぜひいろいろと教えてください。

【Unity】uGUIのテキストを超お手軽に英語対応する方法

私の場合、お手軽なゲームだとuGUIのTextやButtonを使ってすべてのUIを作ってしまいます。Inspectorから文字の入力や修正ができるので楽チンですよね。
f:id:moshimobox:20150820172557p:plain
最近リリースした『金魚育成アプリ』。UIには画像を一切使っていません。

しかし問題になるのがローカライズしたいとき。端末の言語設定はScriptから判定できますが、Scriptから各UIのテキストを書き換えていくのは面倒です。また、日本語の文言はInspectorから設定しているのに、ローカライズ文言はScriptから設定というのも一貫性がなくて嫌ですよね。

というわけで、uGUIのTextをInspectorからお手軽にローカライズできちゃうScriptを作成しました。

[TextLocalizer.cs]

using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class TextLocalizer : MonoBehaviour {
    [Multiline]
    public string englishText;
    public int englishFontSize;
    void Start () {
        Text text = GetComponent<Text> ();
        if (Application.systemLanguage != SystemLanguage.Japanese) {
            text.text = englishText;
            if (englishFontSize != 0) {
                text.fontSize = englishFontSize;
            }
        }
    }
}

これをTextコンポーネントが付いてるGameObjectにAddすると、Inspectorからこんな感じで設定ができます。
f:id:moshimobox:20150820172934p:plain
EnglishTextのところに英語の文言を書けます。複数行にも対応。英語にすると文字数が増えてしまうケースも多いですが、English Font Sizeを設定しておけば英語のときだけフォントサイズを変更することもできます。

英語環境で起動すると、こんな感じ。
f:id:moshimobox:20150820172602p:plain
この仕組みを応用すれば英語以外の言語もInspectorから簡単に設定できますし、Spriteの差し替えも簡単に設定できそうですね。

(確認環境:Unity 5.1.1, iPhone5S

【Unity】Sceneの読み込みで5秒近く固まる際に真っ先に疑うべきこと

前回のブログで「自分のアイデンティティはTitaniumでゲーム作ってることだ!」とか書いておきながら、気付けばUnityに乗り換えていましたw

 

これからはちょくちょくUnity関連の記事を書いてUnity使ってるぜアピールをし、あわよくばUnity使いの方々とお友達になりたいなーなんて下心を持っております。何卒よろしくお願いいたします。

 

というわけで記事一発目。表題の件ですが、Unityで開発していて下記のような動作に悩まされたことはありませんでしょうか。

・Scene読み込み等の際に5秒近く固まる

・一度起きると、アプリを終了するまでは同じSceneを読み込んでも発生しない

・実機(iPhone)でしか発生しない

 

こんなときに真っ先に疑うべきことは、

「初期フォント(Arial)のまま日本語を表示しようとしていないか?」

です!

uGUIのTextもそうですし、ScriptからGUI.Label等を使用している場合も該当します。

 

日本語の含まれていないArial等のフォントで日本語を表示しようとすると、端末の中の日本語フォントを自動的に読み込んで表示してくれるようです。しかし、この読み込みにかなり時間がかかってしまい、その間固まってしまうというのが原因のようです。

 

解決方法は簡単。日本語の使用を止めるか、日本語フォントをプロジェクトにインポートしてArial等の代わりに設定すればOKです。

  

以上、初歩的な内容かもしれませんが、自分がUnityを始めた直後に直面してかなり悩まされた出来事でしたので、同じような方の参考になれば幸いです。

(確認環境:Unity 5.1.1, iPhone5S

【Titanium】文字の縁取りを実現する方法

【はじめに余談】
ふと「自分の独自性ってなんだろう?」と考えたら、【Titanium Mobileでゲームを作ってること】くらいしか思いつきませんでしたw

ゲーム作りに向いているとはとても言えないTitaniumなのですが、今の自分にとっては最速でアプリを作れるフレームワークなので、ゲームだろうがツールだろうがとりあえずこれで作ってしまっています。。

また、「制限の中で工夫してやりたいことを実現する」感じが、昔ハマっていたRPGツクールに似ている点も気に入っている要因かもしれません。

Titaniumでゲームを作るときのノウハウってネット上にあまりないのですが(というかTitaniumでゲームを作っている人口がかなり少ないと思うのですが)、ならば逆にそこが自分の独自性になるかもなと思い立ちまして、これから時々Titaniumでのゲーム制作ノウハウをポストしていこうと思います。


【本題】
今回ご紹介するのは、表題の「文字の縁取りを実現する方法」です。
『ダイス&モンスターズ』では下記のような場面で使っています。
f:id:moshimobox:20150220183010p:plain
ダメージ数字の「4」に黒い縁がついています。
縁取り文字を使うと視認性を高めやすいのですが、Titanium標準のlabelでは実現できません。

私の場合、こんなソースコードで実現しました。

function OutlineLabel(params){	//text, font, textColor, outlineColor
	var baseView = Ti.UI.createView({
		width: Ti.UI.SIZE,
		height: Ti.UI.SIZE,
	});
	var labels = [];
	for(var i=0; i<8; i++){
		var left = null;
		var top = null;
		if(i == 0 || i == 3 || i == 5) left = -1;
		if(i == 0 || i == 1 || i == 2) top = -1;
		if(i == 2 || i == 4 || i == 7) left = 1;
		if(i == 5 || i == 6 || i == 7) top = 1;
		var label = Ti.UI.createLabel({
			text: params.text,
			font: params.font,
			color: params.outlineColor,
			left: left,
			top: top,
		});
		baseView.add(label);
		labels.push(label);
	}
	var label = Ti.UI.createLabel({
		text: params.text,
		font: params.font,
		color: params.textColor,
	});
	baseView.add(label);
	labels.push(label);
	
	baseView.setText = function(text){
		for(var i=0; i<labels.length; i++){
			labels[i].text = text;
		}
	};
	baseView.setTextColor = function(color){
		labels[labels.length - 1].color = color;
	};
	baseView.setOutlineColor = function(color){
		for(var i=0; i<labels.length-1; i++){
			labels[i].color = color;
		}
	};
	baseView.close = function(){
		for(var key in this){
			if(typeof this[key] == 'function') this[key] = null;
		}
	};
	
	return baseView;
}
module.exports = OutlineLabel;

これをこんな感じで使います。

var OutlineLabel = require('OutlineLabel');
var label = new OutlineLabel({
	text: 'hoge',
	font: {fontSize:10},
	textColor: '#FFFFFF',
	outlineColor: '#000000',
});

つまるところ、
・outlineColorでlabelを8個作成し、タテ・ヨコ・ナナメにちょっとずつずらす
・その上にtextColorでlabelを作成して乗っける
という原始的な手法ですw

setText()やsetTextColor()、setOutlineColor()を使うことで、後からテキスト内容やテキスト色、縁の色を変更することもできます。

また、使用後にclose()を呼ぶことでガベージコレクションの対象にもなるはずです(たぶん)。

【アプリ】新作ゲーム『ダイス&モンスターズ』をリリースしました!(Titanium製)

新作をリリースしました!

ダイス&モンスターズ

ダイス&モンスターズ

  • Shumpei Hayashi
  • ゲーム
  • 無料

 久しぶりのゲームアプリです。制作環境はいつも通りTitanium Mobile。

 

リリースから約一週間が経過したところですが、Storeのレビューやレビューサイト等で予想以上の高評価をいただいており、大変嬉しく思っております。

 

また、今回は友人と二人でアプリを制作したのですが、この友人というのが10年来のゲーム制作友達なんですね。「一緒になんか作りましょう!」とネット経由で知り合ったのがまだ10代の頃。それから3分で終わる掌編ゲームを実験的に作った以降、様々な企画に挑戦したものの、一作も完成させることができず、やがてお互いゲーム制作から離れてしまいました。

そんな友人となんやかんやあってまた一緒にゲームを作ることができ、そして10年目にしてついにゲームを完成させることができたので、個人的には感動もひとしおです。

 

今回の制作にあたって、10年前とは作り方を大きく変えた部分があります。それが結果的に「共同制作でゲームを完成させるための秘訣」だったんだなーと確信しました。このあたりは機会があればまた詳しく書きたいと思います。

 

何はともあれ、「ダイス&モンスターズ」は非常に良いゲームになったと自負しています。ぜひ遊んでみてください!