Avatar

iOS6のGuided AccessがすごいのだがAndroidなら前からできてたのだ。

関西/大阪のiPhone・iPadアプリ開発 feedtailor Inc. 社長ブログ

すごい。ちゃんとOSとしてそういうのをサポートするのだからすごい。

Androidではどうか。前からできてた。

android.intent.category.HOME
てカテゴリのActivityを持つアプリを作成する。
ホームアプリとしてアプリを作成するが、他のアプリを起動するアイコンや設定画面へのアクセスを遮断して、フルスクリーンにしてステータスバーも隠す。
これだけでOK。
インストールしてホームボタンを押して、そのアプリをデフォルト起動するようにしたら、端末を再起動するとよい。

ホームボタンを長押ししようが、アプリの起動履歴を見ようが、なにをしようともそのアプリしか操作できない。
もとに戻したかったらパスワードでホームアプリを選択出来るようにするか、adbアクセスできるならadbコマンドでそのアプリをアンインストールすればよい。

android.intent.category.HOMEってカテゴリを持つアプリは別にホームアプリでなくてもよいのだ。インタラクティブなコンテンツやカタログや業務アプリを動かせばよい。

アプリ側でホームアプリのデフォルトを解除できる仕組みを用意しないで、開発者モードもOFFでインストールしてしまうと危険なので要注意。

Tagged with: .
Avatar

Unity4のPreOrder向けBetaを手に入れたので試してみた。

エディタではそんなに変化はなくProjectビューが2ペインになってアセットを検索しやすくなった。従来の表示に戻すこともできる。
ほかにはモバイル向けでもセルフシャドウやダイヤミックフォントが使えるようになった。
GUIも大きく変わってパワーアップするようだが、Beta7には含まれていなかった。

このベータでの大きな見どころは新しく導入されたMecanimってアニメーションシステム。

今までのアニメーションはAnimationコンポーネントで管理されているアニメーションデータを再生したり、クロスフェードしたり、レイヤー分けしてブレンドしたりすべてコードで管理する仕組みだった。
なので状況にあわせてアニメーションを切り替えるにはスクリプト側でステート管理をする必要があった。そんなに複雑ではないが、試行錯誤するには何度もスクリプトを調整するため何度もビルドすることになる。

MecanimではAnimatorControllerというアニメーションの状態遷移を管理してくれる仕組みが用意されている。
ステートマシンというらしい。
MecanimSampleBeta7というサンプルプロジェクトを見てみた。
モデルのインポート設定にはCreate Avatarという項目が用意され、チェックを入れるとAvatarが作成される。
AvatarはMecanimでつかわれる、全てのモデル共通のボーンとマッスルの設定のようなもので、ConfigureとするとMecanimを使うために必須のボーンやらを設定する。
Avatarを作成して共通のボーン設定をすることでアニメーションを別のモデルにリターゲットできるようだ。

AnimatorControllerにはVector、Float、Int、Bool値を持つことができてスクリプトからこの値を更新することができる。
上の図にあるのがアニメーションの遷移図で1つのノードがアニメーションをあらわしている。
アニメーションとアニメーションの間には矢印があり、トランジションという。トランジションには遷移する条件を設定する。
たとえばFloat型のSpeed値が0.1以上だとIdleノードからRunノードに遷移する、とかBool型のJump値がtrueだとRunノードからJumpノードに遷移するといった具合。
デフォルトでは数秒後に遷移するといった条件になっている。
また、条件は複数設定できる。

これらの値をスクリプトで変更を加えるには、MonoBehaviour.OnAvatarMove()をオーバーライドしたコンポーネントを追加して、AnimatorコンポーネントでHandled By Scriptとなるようにしてやる必要がある。
そしてGetComponent() でAnimatorコンポーネントにアクセスして
SetFloat(“Speed”, 0.5); SetBool(“Jump”, true);
などとしてAnimationContorollerにパラメータを渡してやる。
AnimationControllerは受け取ったパラメータによってアニメーションの状態遷移をするという具合だ。

アニメーションクリップにはカーブという値を設定することができる。
モデルのアニメーションクリップのインポート設定のところでアニメーションのフレームに合わせてFloat値を設定でき、AnimationControllerのパラメータに渡すことができる。
これをスクリプトで GetFloat(“JumpVertical”);などとしてアニメーションのフレーム毎の値を取ることができる。
これをキャラクターのposition.y や colliderのサイズ変更に使うとアニメーションクリップからのカーブ値をスクリプトに反映することができる。

これまでアニメーション付きモデルをインポートするためには前進やジャンプするアニメーションでも、キャラクターがその場で動いているようなアニメーションを作成してからUnityにインポートする必要があったが、Mecanimでは実際にアニメーションしてもよく、MonoBehaviour.OnAvatarMove()で GetComponent().deltaPositionとするとアニメーションでの移動量を取得するとこができる。これをtransform.positionに反映すればアニメーションクリップでの移動量を実際のキャラクターの移動に反映できる。これはおもしろい。

現状のほとんどのMecanimのサンプルはアニメーション側の移動量を受け取ってキャラクターを動作させるというものであった。
そしてカプセルコライダーとRotationを拘束したRigidBodyをつかってキャラクターアニメーションを行なっているものばかりであった。
もしやMecanimはCharacterControllerと合わせて使えないのか!?と思ったが、MecanimSampleBeta7のgravityというシーンではMecanimとCharacterControllerの組み合わせであった。
これを参考にすると従来のCharacterControllerとAnimationコンポーネントのキャラクターをMecanimバージョンに移行する助けになると思う。

以上。

Tagged with: .
Avatar

Unity3.5Proを購入して2週間ほどたったかな。
Unity4が発表されて、予約注文した人は3.5Proも両方使えるようになると。
6月1日以降に3.5Pro購入した人も無料アップデートですよと。
5月28日に購入した俺って。。。ついてない。7万円くらい損したようなきがする。
それにしても4の新しいアニメーションシステムはすごいなー。

はて、Androidビルドするときスプラッシュ画面でインジケーターを表示する設定があるのだが、これが画面左上固定なんやね。くるくる回るやつ。
どんなコードになっているのか調べたらたしかに画面左上に固定になるようにハードコーディングされているのね。

ネイティブプラグインで位置を動かすなり、別のローディングを表示するなりしたら解決しそう。
と、いうわけでやってみた。
https://bitbucket.org/Saikoro/unity-android-progress-test

UnityPlayerクラスを拡張してstartActivityIndicator()、stopActivityIndicator()をオーバーライドすればなんとかなったのだが、UnityPlayerって拡張して名前が変わると2.3以降のNativeActivityからのタッチイベントとか呼べないのかクラッシュしてしまう。仕方なくUnityPlayerのProgressDialog表示・非表示を実行しているRunnableオブジェクトを無理やり書き換える方法で実装してみた。
しかし、UnityPlayerってクラスはFrameLayoutを拡張しているので適当なViewを重ねたらスプラッシュスクリーンもろともカスタムローディング画面になりますがな。
スプラッシュスクリーンのカスタムってPro専用フューチャーやなかったのかな。

Tagged with: .
« Previous Page