Unityのアドオンが無償化されたので一日でゲーム作ってリリースしてみた

unity android

先日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はPythonC#を混ぜた感じのような言語らしいです。
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のパスを指定します。

ビルド先対象を変更する

"File"->"BuildSettings"から設定ウィンドウを開きます。
"Platform"の項目を"Android"に変更します。
設定後、"File"->"Build & Run"を実行するとapkファイルを作成しつつ、接続されたAndroidに作成したアプリがインストールされます。

署名

Androidアプリはリリース前にkeytoolsで署名を行いますが、
UnityではUnity上から署名を行うことが可能です。
BuildSettingsウィンドウから"Player Settings"ボタンをクリックします。
すると、設定画面が開くため、"Settings for Android"タブ->"Publishing Settings"から
"Create New Keystore"にチェックを入れ、パスワードを入力し、keyを作成し、署名ができます。

広告

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の使い方が一から書いてあり、初めての人はこれから始めるといいかもしれません。

実際に動くサンプルゲームのコードが付属のディスク内にいくつも入っています。
サンプルゲームは2Dゲームばかりですが、NGUIを利用しておりません。

ゲームの作り方 Unityで覚える遊びのアルゴリズム

ゲームの作り方 Unityで覚える遊びのアルゴリズム


以上、2013/05/18にAndroid向けアドオンを購入してしまった私がUnityを利用してAndroid向けゲームを作成した際の色々なまとめでした。
スマホゲームを作成したのは今回が初めてですが、簡単に作成することができました!


今回技術的なことについて触れていないため、次回は技術的な面について触れた記事を書きたいと思います。

Eclipse+MavenでAndroidプロジェクトを管理する際にADT20にアップデートしたらハマった

androideclipsejavamaven
やろうとしてぐぐって簡単にできるじゃないかーと思ってたらハマったのでメモ

http://rgladwell.github.com/m2e-android/
上記に沿ってできればできるらしい
が、ADTを最新の20.0にしたらエラーでつまる

m2e Marketplaceでインストールできるm2e-androidがADT20に対応していない。ADTをダウングレードしてもEclipseにADT最新にしろと怒られる
下記のURLをInstall New Softwareに突っ込んでADT20に対応しているm2e-androidをインストールすると直った

http://rgladwell.github.com/m2e-android/updates/master/

Vimの":e"でファイル開くときに大文字小文字を無視してzshのように候補を出す

vimzsh

下記の二行でできる。

$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拡張作成した

chrome,javascript

複数の参考サイトを見る際タブ切り替えをするときタブが隣り合っていた方が切り替えがスムーズです。私の所感ですが。
タブの位置を移動させるにはマウスで移動させるのが面倒。なのでキーボードでタブを左、右のタブを入れ替えることができる拡張作った。
探しても見つからなかったので。あればそっち使いたい。

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→MavenMaven Repositories→Global Repositories→centralを右クリックして「Update index」

初回起動で作成されるフォルダの削除

$HOME/.m2/repository/.cache/m2e以下にダウンロードしたm2eclipseのバージョン番号の名前がついたフォルダがある。今回の場合「0.12.0」。これを削除してeclipseを起動し再度インデックスの更新を行う。そのときにはインデックスの更新が終わるまでぼーっとしてること

私の場合後者でなおった