NGUI 3.0.2 でのバグ

NGUI 3.0.2 でUIButtonMessage を使っていて、
なおかつ、タッチパネル用のアプリ作成なので

UICamera.useMouse = true;
UICamera.useTouch = true;

にしている場合。

Unityエディタ上で作業している場合には大丈夫だが、
Android端末などで実行するとOnClickメッセージが2回飛んでくることがある。
(タッチ→指を動かさない→指離す で確認できる。この際、タッチ後に少しでも指を動かすと2重メッセージは飛んでこない)

携帯端末でマウスが無いにもかかわらずマウスの分のメッセージをNGUIが発信してしまっているようだ。

バージョン 3.0.7 f1 にしておけば修正されているようだ。
が、いろいろ都合上バージョンアップできないこともあると思われるので取り急ぎこんな感じで対処はできる。


public class UICamera : MonoBehaviour
{
...略....
void Update ()
{
...略....
#if UNITY_EDITOR
// Update mouse input
if (useMouse || (useTouch && mIsEditor)) ProcessMouse();
#endif
...略....
}

facebookのプラグイン+ほかのプラグイン

UnityPlayerActivityを継承したプラグインを複数使いたいときの話。

フォーラムにActivityを動的に切り替えるTipsが載ってる。うまくいくかどうかはやってないのでわからない。
http://forum.unity3d.com/threads/149089-Android-Plugin-multiple-Android-Activity-problems
もし挑戦した方がいらしたらどうだったか教えてください。


Facebookオフィシャルのプラグイン + UnityPlayerActivityを継承した何かのプラグイン、を使いたいときは別の方法がある。

version4.3.3 からjavaのソースが同梱されている。
FBUnityPlayerActivity
FBUnityPlayerNativeActivity
これらのクラスの継承元がそれぞれ、
UnityPlayerActivity
UnityPlayerNativeActivity

となっている。
これらの継承元クラス指定を自分が使いたいプラグインのクラスにして、ビルドしなおしてjarファイルを作りなおしてしまえばいい。

その際、antで使用する build.xml,local.properties,project.properties これらのファイル内に記述がある、AndroidSDKへのパスやjarファイルのパスなどを適宜自分の環境に合わせて修正する。

FBUnityPlayerActivityもしくはFBUnityPlayerNativeActivityが起動時に使用されるように
AndroidManifest.xmlを修正。

こうすればとりあえず2つのプラグインはいける。
javaが多重継承できないので3つは無理。

UnityPlayerActivity と UnityPlayerNativeActivity どちらを使うか?の切り替え用のクラスがもともと存在しないようだ。
(以上2つの違いについては http://radiumsoftware.tumblr.com/post/13288868429 参照)


FacebookオフィシャルのFacebook SDK for Unity Downloadsサイト
https://developers.facebook.com/docs/unity/downloads/?campaign_id=282184128580929&placement=SDK_list

しかし月1ペース(以上)でSDKが更新されるので迷惑きわまる。。。

Starling Framework を使う上での注意点

しばらくStarlingをいじってみてわかったのでメモ。
Starlingを導入する時点での注意点でもあります。

最大の問題は、
「描画の実行順序(Z-order)と挙動(onEnterFrame)の実行順序が同じになってしまう、自由にZ-orderが指定できない」
という点ですね。

描画にZ-bufferを使用していない&親子リストがひとつしかない、というのがこういう結果を生んでる、と。
まあ、最速を求めると、ベンチマークの値の向上だけを考えるとこういう感じの仕様になっていくのはわかるけど実際ゲームを作るとなるとこれじゃつらいなあ。


ただ、これらの注意点、弱点があってもなおStarlingフレームワークを使ったほうが有利な点が多いという印象です。
いい感じにこの弱点を克服するラッパーつくらないとなあ。

AS3のstarlingフレームワークの実行順序

starlingフレームワークをちょっと調べてみた。Version 1.4.1
http://gamua.com/starling/


starlingフレームワークではSpriteとかDisplayObjectの派生クラスにて
・ENTER_FRAME
・TOUCH
・KEY_DOWN
をaddEventListenerしてなんかしらのイベント処理を行う。
(注意:import flash.display.Sprite; などのAS3でのaddEventListenerの話ではありません)

	import starling.display.Sprite;

	public class Game extends Sprite
	{
		...

		public function Game()
		{
			addEventListener(TouchEvent.TOUCH, onTouch);
			addEventListener(Event.ENTER_FRAME, onEnterFrame);
			addEventListener(KeyboardEvent.KEY_DOWN, onKey);
		}

		private function onTouch(event:TouchEvent):void
		{
			...something
		}

		private function onEnterFrame(event:EnterFrameEvent):void
		{
			...something
		}

		private function onKey(event:KeyboardEvent):void
		{
			...something
		}


この際、onTouch onEnterFrame onKey の実行順序が不定の場合、もしくは何かを実行している最中に割り込みがかかる可能性がある場合、非常に厄介なバグになるので実行順序を確認した。

結論
・onTouch→onEnterFrame は実行順序保障されている。
・しかし、タッチの割り込みが多い場合はonTouch→onTouch→onTouch→onEnterFrame という実行になる場合がある。
・onKey はいつどこで走るかわからない。

ということのようなので何かと使いづらいし危険だ・・・
「キーもタッチも1フレームに1回取得しに行って、もし中間があっても中間点は捨てる」
という実装にしてくれたほうが面倒ないんだけど。
これだと素のAS3とあんまり変わらない。うーん。

Unityとか最近のゲームフレームワーク的なものはこういうイベントドリブンの実装が多いんだけど、こういうフレームワーク上にプログラムをうまくまとめる方法論がいまいち見つかってないんだよなあ。

TexturePacker を買うお金がない人のために

いつの間にか業界標準的になりつつある気配のTexturePacker
http://www.codeandweb.com/texturepacker
¥4000-くらいのお値段なので高校生の個人とかにはつらかろう。
そこで、無料で使える物の紹介。

前提でお断りしておくと
・starlingフレームワーク向けにはそこそこ使える
・TexturePacker買えるなら買ったほうが楽
・cocos-2d cocos-2dx にはそのままでは使えない(plistファイル出力しないので)
・画像を横向きに配置するなどして、テクスチャの有効活用をすることはできない。
 (たぶんAIRのstarlingフレームワークが対応してないから)
・その他いろいろ足りない

というもろもろ自助努力が必要ですが・・・。

sparrowフレームワーク
http://gamua.com/sparrow/
からダウンロード。

解凍したら、generate_atlas.rbというファイルがあるので

ruby generate_atlas.rb tex/*.png tex.xml -m 4096x4096

みたいな感じで実行してあげれば、テクスチャパックできる。
ただし、rubyimagemagick やら gemのquick_magick やらをインストールしないといけないので敷居が高いしめんどくさい。

ここまで書いておいてなんだが、技術系のブログを書いてる人ならTexturePackerのライセンスタダでもらえるらしいとの情報入手。
ここにアクセスしてメールでライセンス貰うのかな?(試してない)
http://www.codeandweb.com/request-free-license
まあ、ブログ書いてタダでもらえばいいかもね。
1年後にまだ使いたい場合アップデート料金取られるかもしれないけどそのへんはよくわからん。

ところで、TexturePackerってpivot(表示中心点)設定できないのかな?
generate_atlas.rbはできないし、しかもstarlingフレームワーク事体がデータ(*.xml)でpivotを設定することに対応してないみたい。
これは。。不便だ。。。

Adobe AIR SDK には2種類ある!

Adobe AiriOSAndroidアプリが作れる。
Unityもいいんだけど、3Dを使わない場合とか、ゲームじゃない場合とかはAirの方がいいかなーと思い、FlashDevelopなどで無料で環境構築してみた。

・FlashDevelop
Flex SDK
Air SDK

これらをダウンロードして解凍し、Flex SDKAir SDKをマージ(というかファイル上書き)して
FlashDevelopの設定でFlex SDKのあるフォルダにパスを通すだけ。

ただ、Air SDKに1つ注意点がある。
ダウンロードサイト、http://www.adobe.com/devnet/air/air-sdk-download.html を見ると

Download Now と書いてあるオレンジ色のボタンがありその下あたりに

Note: Flex users will need to download the original AIR SDK without the new compiler.
Download Mac | Download Windows

というリンクがある。これらはそれぞれ、
・AIRSDK_Compiler.zip (オレンジ色のボタンリンク)
・AdobeAIRSDK.zip (テキストリンク)
というファイルがダウンロードできるのだが、Air Mobile Flex Appを使う場合は
AdobeAIRSDK.zipのほうをダウンロードして使うこと。

そうしないと
Error: Could not resolve to a component implementation.
というエラーが出てコンパイルにしくじる。
( はアプリの種類によって少し変わるかも)

日本語での参考情報はないけどStack Overflowに載ってました。
http://stackoverflow.com/questions/3152679/could-not-resolve-to-a-component-implementation

なんでこんなことになってるのかはAdobeの中の人に聞かないとわからない・・・

Windows環境で gem 'twitter-bootstrap-rails' は、あきらめた話

Windows環境でRailstwitter-bootstrapを使いたく思い、

http://gagapi.hatenablog.jp/entry/2013/05/15/190651

を参考に途中まで進めたけど問題発生。
もう絶対に解決できそうになかったのであきらめた。

lessのコンパイルにV8エンジンを使うのでtherubyracerというgemをインストしたいんだよね? これ。
以下のようなエラーが出て bundle install 、therubyracerのインストールが失敗する。

	Could not find gem 'therubyracer (> = 0) x64-mingw32' in source at ...

WindowsRubyインストールしたとき64bit版インストールしてたわー。
Ruby環境が64bitなのに、32bit版のgem "therubyracer x86-mingw32" はインストールできないよね。
。。。もしかしてできるの? もしできるのならごめんなさい。やり方教えてください。

ということで素早くあきらめた。

そもそも twitter-bootstrapのsass版、bootstrap-sassってのがあるみたいだからこっちでいいやん。
と、思いつつさまよってたら

https://github.com/decioferreira/bootstrap-generators/issues/18

「The gem already includes a version bootstrap. You don't need bootstrap-sass.」
ということで gem 'bootstrap-sass' も必要ないみたい。

https://github.com/decioferreira/bootstrap-generators#generators



そして結局Vagrantでいろいろ全てが解決。わかってたけどなー。。