やや濃厚なソース

プログラミングやゲームについて。

インディゲームについて

BitSummitに行ってきたのでその感想を。

一言で表すならとても面白かったです。
どう面白いかと言いますと、なんとか2のようなシリーズ物が無く
独創性の塊だらけでした。
会社がゲームを作るとなると、予算や納期の都合上から、
飛びぬけたゲームは作りにくいのが現状ですが、
予算とか納期とかを気にしないで、品質重視になっており、非常に面白かったです。

一昔前まではゲーム制作販売は、
・ゲーム制作ツールが高価
・限定されたゲームマーケット
のため、一部の既得権層が有利に制作販売できていました。
これが、
・Unity3dやcocos2d-xなどの安価なゲーム制作ツール
・誰でも世界に向けて発信できるマーケットである、Google PlayiTunes StoreやPlayism
のため、誰でもアイデアさえあれば制作販売できるようになってきました。

数人のチームで作った独創的なインディゲームがGoogle Playなどのマーケットの上位に現れる、
という日もそのうち来るんだろうなあ、と楽しみにしております。

Unity と Android, iPhone のネイティブ連携

Unity でゲームを作る際、
単体で作れるならばそれが一番好ましいんですが、
様々な要因によりネイティブとのハイブリッドで動かさないと
いけないことも起こることもあるかと思います。
これはその記録です。
玄人向けの説明です。Unity, Android, iPhone 初心者はやらない方がいいと思います。
あと、非推奨の動かし方ですのでサポートももちろん受けられません。

Android
Activity 単位で連携させるのが一番容易。
MyActivity が俺ソース、UnityActivity が Unity が書き出したソース。
MyActivity から UnityActivity へのデータの送信は intent を使い、UnityActivity から Unity のコアへのデータ送信は UnitySendMessage を使った。UnitySendMessage の第3引数を null にしてると動かないことがあったので、送るデータが無くても空文字を送りましょう。
Unity コアから MyActivity へは intent を使ってデータを飛ばした。

注意としては、UnityActivity の OnDestory 関数 が呼ばれると、Unity コア内部で Application.Exit が呼ばれるのか、MyActivity まで死んでしまうことが起こった。
そこで、UnityActivity は一回作られると、アプリ起動中はずっと、単一 Activity が必ず存在するようにし Activity が死なないように設定を行った(Launch mode = Single Task)。

iPhone
ViewControllerを取り替える方法で連携させた、というかこれ以外方法が思いつかなかった。
MyAppController が俺ソース、UnityAppController が Unity が書き出したソース。
MyAppController も UnityAppController もそれぞれ、Window, ViewController, View を新しく作成するが、
アプリ内に複数の Window があるとうまく動作しないため、単一の Window しか作成されないようにした。
具体的には、ApplicationDelegate を MyAppController も、UnityAppController も継承しているが、
まず ApplicationDelegate を MyAppController に継承させ、次に MyAppController を UnityAppController で継承させた。
もちろん、application:didFinishLaunchingWithOptions: などの関数は、親を呼び出し処理するようにすること!
そして、Window を作る際、もう作成されてるならば作らない、という処理にすることで、単一の Window を確保した。
ViewController, View はそれぞれの AppController が作成し、必要に応じて、これらを切り替えるようにした。

MyAppController から Unity コアへのデータ送信は UnitySendMesssage を使った。
逆に Unity コアから MyAppController へのデータ送信は Unity のプラグイン機能(確かプロライセンスでしか使えない)で
iPhone のネイティブ関数を呼び出す機能を使った。

AndroidiPhone もクセのある処理になってしまいましたが、
動作は確認しております。
が、できるなら使いたくない所。