Unityのアドオンが無償化されたので一日でゲーム作ってリリースしてみた
先日2013/05/21に無償版UnityのiOS/Android向けアドオンが無償化されました。
ということで、簡単なゲームを作成してリリースまでこぎ着けました。
ゲームの実装方法ではなく、Androidでリリースするために行った作業をまとめます。
成果物
単純なタップゲームです。
Macを持っていないためAndroidのみのリリースです
https://play.google.com/store/apps/details?id=com.w1mvy.arrowgame
Unityって
Unityはゲームエンジンです。cocos2d-x、coronaSDKなどのフレームワークとは異なり、ツールや開発環境が
提供されております。とにかくすげー便利ということです。
開発言語としてはC#、Boo、UnityScript(JavaScript)の三種類が選択できます。
C#を書いたことがないので合っているかどうかわかりませんが普通のC#として書けるようです。
Unityを利用している企業などでは一番選択される言語なんでしょうか
「もののけ大戦“陣”」製作事例
BooはPythonとC#を混ぜた感じのような言語らしいです。
http://boo.codehaus.org/
http://www.atsuhiro-me.net/unity/dev/boo-basic
UnityScriptは調べた限りではJavaScriptの見た目をしたC#で、JavaScriptっぽい
書き方ができないようで、色々なところでディスられています。
トップページ - antiunityscript @ ウィキ - アットウィキ
今回はPythonの経験があるためBooで記述してみました。
Unityのダウンロード
http://japan.unity3d.com/unity/download/
上記からダウンロードして適当にインストールします。
Unityアカウントも必要のようで、どこかしらのタイミングで作成要求をされるので
言われるがままに作成します。
これで開発準備が整いました。
AssetStore
http://japan.unity3d.com/asset-store/
UnityにはAssetStoreと呼ばれる様々なアセットが購入、ダウンロードができるサービスがあります。
有名なアセットは以下のようにあるみたいです。
今回は2Dゲームの作成ということでNGUIを購入、利用しました。
NGUI
http://www.tasharen.com/?page_id=140
2Dゲームではほぼ必要不可欠なぐらい有名なアセットです。
値段は$95します。フリー版もありますが、フリー版は古いバージョンでかつ、アプリ起動時に
NGUIの広告が表示されてしまうため、リリースするためのアプリを作成するのであれば、
購入すべきかと思います。
使い方に関しては下記のまとめが参考になりました!
NGUIの使い方に関する記事まとめ - その後のその後
iTween
http://itween.pixelplacement.com/
オブジェクトの操作をよりリッチに簡単に動かせるアセットです。
こちらはフリーで提供されています。
FinguerGestures
http://fingergestures.fatalfrog.com/
タップ、ドラッグ、スワイプでの操作を簡単に作成できるアセットです。
こちらは$55で販売されております。
AssetStoreでの購入方法
"Window"->"AssetStore"からAssetStoreのウィンドウを開きます。
欲しいアセットがあれば、購入orダウンロードを行い、自分のプロジェクトにインポートします。
今回利用したアセットはNGUIのみで、購入、インポートを行いました。
Androidに向けてビルド
Androidに向けてビルドするため、AndroidSDKをダウンロードします。
最新のAndroid SDK Tools (rev. 22)でAndroidのビルドができない件について | Unity Japan Official Blog
上記にあるように、rev.22でビルドが失敗するバグが発生しているため、
rev.21を利用してください。
AndroidSDKのパスを通す
"Edit"->"Preferences"よりウィンドウを開き、"ExternalTools"という項目の中に
"AndroidSDKLocation"という設定項目があるため、そこにAndroidSDKのパスを指定します。
広告
Androidの広告はいくつかありますが、今回はAdMobを利用しました。
Google AdMob - モバイルアプリの収益化、分析、メディエーションに登録し、idを発行します。
Unityでの広告の表示は下記を利用しました。
GitHub - keijiro/unity-adbanner-example: Unity で iAd (iOS) と AdMob (Android) を共用する場合の実装例
ビルド済みのパッケージが用意されているので感謝しつつ利用します。
パッケージをインポート後、以下のようにたった一行記述することで広告が表示されます!!
リリース作業
Play Console の使用方法 - Play Console ヘルプ
GooglePlayDeveloperConsoleアカウントに登録します。$25かかります。
新しいアプリの項目を作成後、タイトル、ビルドしたapkファイルのアップロード、下記のようなアプリの説明などを記述すると
簡単にアプリがリリースできます。
再度宣伝
二度目になりますが、下記が今回作成したゲームです。
$95のNGUIを購入したので、皆様インストールして頂けると嬉しい限りです。
https://play.google.com/store/apps/details?id=com.w1mvy.arrowgame
書籍
今回の開発にあたって以下の参考書を購入しました。
初心者向けのUnityの使い方が一から書いてあり、初めての人はこれから始めるといいかもしれません。
Unity入門 ~高機能ゲームエンジンによるマルチプラットフォーム開発~
- 作者: 高橋啓治郎
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/10/01
- メディア: 大型本
- 購入: 15人 クリック: 609回
- この商品を含むブログ (24件) を見る
実際に動くサンプルゲームのコードが付属のディスク内にいくつも入っています。
サンプルゲームは2Dゲームばかりですが、NGUIを利用しておりません。
- 作者: 加藤政樹
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2013/02/26
- メディア: 単行本
- 購入: 3人 クリック: 16回
- この商品を含むブログ (8件) を見る
以上、2013/05/18にAndroid向けアドオンを購入してしまった私がUnityを利用してAndroid向けゲームを作成した際の色々なまとめでした。
スマホゲームを作成したのは今回が初めてですが、簡単に作成することができました!
今回技術的なことについて触れていないため、次回は技術的な面について触れた記事を書きたいと思います。
Eclipse+MavenでAndroidプロジェクトを管理する際にADT20にアップデートしたらハマった
Vimの":e"でファイル開くときに大文字小文字を無視してzshのように候補を出す
下記の二行でできる。
$set wildignorecase $set wildmode=list:full
補完一覧だけを表示したい場合は
$set wildmode=list,full
のように設定する
また、自分の環境でははVim7.3をソースからインストールしていて"set wildignorecase"
が設定できず、パッチを当ててインストールし直した。
$wget -r ftp://ftp.vim.org/pub/vim/patches/7.3/ #パッチファイル落としてくる $cd vim73 # Vim73のソースディレクトリに移動 $cat /path/to/ftp.vim.org/pub/vim/patches/7.3/* | patch -p0 # パッチファイル当てる # makeしてインストール $./configure --prefix=$HOME/local --enable-multibyte --with-local-dir=$HOME/local $make $make install
キーボードでタブの位置を移動できるChrome拡張作成した
複数の参考サイトを見る際タブ切り替えをするときタブが隣り合っていた方が切り替えがスムーズです。私の所感ですが。
タブの位置を移動させるにはマウスで移動させるのが面倒。なのでキーボードでタブを左、右のタブを入れ替えることができる拡張作った。
探しても見つからなかったので。あればそっち使いたい。
https://chrome.google.com/webstore/detail/ogafboimoihmchmoicjocaokenodbmpl?hl=ja
インストールしたら動かしたいタブをリロードしてください。JS読み込まれないです。
- Ctrl + Shift + H
- 現在のタブを左に移動させる
- Ctrl + Shift + L
- 現在のタブを右に移動させる
「意識の高いポッパー」の特徴のまとめ
最近、「意識の高い学生」という言葉をよく見かけるが、意識の高いポッパーのイメージを書いてみた。ネタなので気にしないでください
- 積極的にゲーセンに通う
- 音ゲーに積極的に取り組んでいる
- プレイ前に上着を脱ぐ
- ソーシャルメディアを積極的に活用している。
- やたらと指押ししたがる
- やたらと辛ゲージという言葉を使う
- バトルモードしたがる
- 電車内でイヤホンを付けずにPMP2をプレイ
- 電車の中でアルカディアを読む
- コンポーザーとの接点を持ってることを自慢する(Yoshita◯さんと会ってきましたとツイートする)
- コンボ切れたので捨てましたとかつぶやく
- やたらとプレイ時に足を開く
- wacが大好き
- Deuilで妄想する
- スマホは必須アイテム
- 女性のキャリーケース所有率が高い
- キャラクターのしゃべりや性格の間違いを指摘して、ボクキャラ理解してるアピール
- あーレイナかわいいぺろぺろとつぶやく
- レイナを飼う準備をしている、とツイートする
- 自分の考えた妄想をツイートする。
- サイレントEXに目を向け、今の譜面は人間が押すものじゃないと批判する。
- 自分のプレイ姿は凡人ではないと考えている。
- 連コインは汚いと批判する
- 連コインを見下す
- 穴場の1クレ6曲設定のゲーセンを利用したがる
- ミサワっぽいことを真剣に言う
- ハヤトのようにスケボーで通学
- 常にネット対戦で勝負している
- レベルが高い人のプレイを見て素直に「学ぶものが多い」と言う
- アテも無く遠くのゲーセンに行く
- ポップン以外のゲームをしない
- アルカディア以外の本を読まない
- ポップン以外の音楽を聞かない
- twitterで変態率が高い
Play!ScalaでGAE
scalaplaygae
Play!がいつの間にやらScalaのフレームワークになっていたから触ってみた
モジュールインストール
とりあえずPlay!のScala、GAE、sienaモジュールをインストールしてプロジェクト作成する
sienaというライブラリがあること初めて知った
$play install scala $play install gae $play install siena $play new miyukiti --with scala
実行するときは
プロジェクトの中まで移動して
$play run
もしくは
$play run miyukiti
で実行できます
モジュール設定
conf/application.confにモジュールの設定を行う。
これで各モジュールが利用できるようになります。
module.scala=${play.path}/modules/scala-0.9.1
module.gae=${play.path}/modules/gae-1.4
module.siena=${play.path}/modules/siena-2.0.6
デプロイ
war/appengine-generatedフォルダにappengine-web.xmlがあるのでアプリケーションIDなどを書き換えて
$play gae:deploy
でデプロイできます。
Todoアプリ
Todoアプリを作成してみます。
モデル
app/models/Todo.scala
package models import play.modules.siena._ import siena._ import java.util._ class Todo ( @NotNull n:String, @NotNull t:String, f:Boolean = false ) extends Model { val task:String = t val name:String = n var finish:Boolean = f @Id var id: Long = _ } object Todo { def all(): Query[Todo] = Model.all(classOf[Todo]) def allfetch = all.fetch() def getAllTask = all.filter("finish", false).fetch() def get(id: Long) = all.filter("id", id).get() }
コントローラ
app/controllers.scala
package controllers import play._ import play.mvc._ import play.modules.gae._ import com.google.appengine.api.users._ import models._ import scala.collection.JavaConversions._ import java.util._ object Application extends Controller{ import views.Application._ def index = { html.index(todos = Todo.getAllTask.toList) } def insert = { val name = params.get("name") val task = params.get("task") val todo = new Todo(task , name) todo.insert Action(index) } def done(id:Long) = { val todo = Todo.get(id) todo.finish = true todo.update Action(index) } def delete = { val todos = Todo.allfetch.toList for(todo <- todos){ todo.delete } Action(index) } }
ビュー
@の後はScalaのコードが書けるみたい
app/views/main.scala.html
@(title:String = "")(body: => Html) <!DOCTYPE html> <html> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@asset("public/stylesheets/main.css")"> <link rel="shortcut icon" type="image/png" href="@asset("public/images/favicon.png")"> <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script> </head> <body> The Hello world app. <hr /> @body </body> </html>
app/views/Application/index.scala.html
@(todos:List[models.Todo]) @main(){ Welcome! <a href="@action(controllers.Application.login)">Login</a> <a href="@action(controllers.Application.logout)">Logout</a> @form(controllers.Application.insert){ <input type="text" name="name" /> <input type="text" name="task" /> <input type="submit" value="add" /> } @if(!todos.isEmpty){ @todos.map{ todo => <li> <span>task: @todo.name</span> <span>task:@todo.task</span> <a href="@action(controllers.Application.done(todo.id:Long))">Done!</a> </li> } }else{ <p>No Entity</p> } }
簡単!こんなんで動いた!凄い簡単!Scalaよく分かってないけど書けた。
ローカルデータストアを見たいんだけどどうしたらいいかわからない。今まではhttp://localhost:8080/_ah/adminでローカルデータストア一覧したり削除したりできたのに…。deleteメソッド作成したけど何か一覧できる方法あるのかしら…。
m2eclipseでインデックス作成失敗してリポジトリの検索ができない
m2eclipseのインストール後初回起動時にインデックス作成のために非常に時間がかかる。時間がかかるからといってダウンロードを中止したり、コマンドラインでmavenをいじったりしているとインデックス作成に失敗してリポジトリの検索ができなくなり泣くはめになる。以下その対処方法色々。
インデックスの更新
Window→Show View→Other→Maven→Maven Repositories→Global Repositories→centralを右クリックして「Update index」
初回起動で作成されるフォルダの削除
$HOME/.m2/repository/.cache/m2e以下にダウンロードしたm2eclipseのバージョン番号の名前がついたフォルダがある。今回の場合「0.12.0」。これを削除してeclipseを起動し再度インデックスの更新を行う。そのときにはインデックスの更新が終わるまでぼーっとしてること
私の場合後者でなおった