Androidに書き出したアプリのログを確認する方法

android_device_monitor

Unityで書き出したものをAndroid端末で見る際にログが見たいなと思い調べてみました。
Android端末にかき出すためにAndroidのSDKを入れたと思うんですがそのSDKのtoolsの中にmonitorというアプリがあるのでこちらを立ち上げればAndroidのすべてのログが確認できます。

参考)

アニメーションのマスク

layer_mask

アニメーションで歩いているキャラに手を上げさせたい場合、別途手を上げて歩いているアニメーションを作るといろいろと大変になってくるのでマスクするにはどうしたらいいのかなと思ったらMecanimにLayerという概念があった。
ちょっとテキトーなキャラを作って動かしてみたところできた。

Animator上でLayerを追加するとLayerの設定に、weightというのがあってこいつが他のレイヤーとの動きの重みとなっている。Maskというのは3Dオブジェクトのどの部分を指すかというオブジェクトでAssetsにCreate => Avatar Maskで作成できる。Humanoidの場合はパーツを選べばいいし、独自の3Dパーツであれば指定したAvatarからボーンの構造を選んで指定できる。Layerの設定に今回であれば右腕だけをマスクしたAvatar Maskを設定してweightを変えれば歩きながら右腕をあげる動きの完成。Blendingはマスクしたパーツの動きを上書きするかどうか(Override)、もしくは重ねるか(Additive)が選べる。Syncを選択すると選択したレイヤーと同じステートマシーンの構造が作られるので手をあげるでも、歩いている時走っているときなどで変えたい時にいいのかな。

参考)Unity | アニメーションレイヤー

Unityのサンプルプロジェクト

Unityをインストールするときにサンプルプロジェクトを入れるかどうか聞かれるので、インストールしてみたけどどこにあるのか分からなかった。
そしたらここにあった。(Mac)

/ユーザー/共有/Unity/Standard Assets Example Project

Rigidbodyで最初に力を加える

blender_add_force
BlenderでRigidbodyを割り当てられているものに最初にどうやって力を与えたらいいのかわからなかったので調べてみた。(Unityでいうところのrigidbody.AddForce()てきな)
オブジェクトにRigidbodyを割り当てたまま、タイムラインで動かしたい方向に移動(とか回転)をつける。
アニメーションの最初はAnimatedをONにして、最後のフレームではAnimatedをOFFにしたらそれっぽくできた。
blender_add_force_animated

Forceだとうまくコントロールできないし、ほかになにか方法ないのかな?

参考)MM-TECHNOLOGY | Rigidbody

動的にボタンにデータを持った機能を加える

※)15.06.06 一番下に追記あり

動的にボタンを作成したときに、それぞれのボタンに対して情報を分けた処理をさせたい。
ラムダ式でパラメータ渡そうと思ったけどうまく行かない。

using UnityEngine;
using UnityEngine.UI;
using System;

public class Test : MonoBehaviour {
	// ボタンのプレハブ
	public GameObject buttonPrefab;

	// Start.
	void Start () {
		for (int i = 0; i < 10; ++i) {
			GameObject buttonGO = (GameObject)Instantiate(this.buttonPrefab);
			buttonGO.transform.SetParent(this.transform, false);

			Button button = buttonGO.GetComponent<Button>();
			button.onClick.AddListener(() => {
				this.DoSomething(i);
			});
		}			
	}

	// なにか処理する
	void DoSomething(int num) {
		print(num);
	}
}

Continue…

App Previewsの動画アップができない

iTunes Connectにて動画がアップできないのでなんでか調べたら音声のサンプルレートが高かったからみたいだ。
44.1kHzにしたら行けた。
他にもフレームレートも30fpsじゃないといけなかったり注意が必要。
アップできる仕様はこちら
しかも、各スクリーンサイズに合わせて動画用意しないといけないのか。。。大変だ。

触れるUIと触れないUI

3D上のタッチと、uGUI上の演出がかぶったときに3D上のタッチが効かなくなるケースがある。
サンプルだとキューブとテキストの部分)
そんな時はCanvas上のGraphic RaycaterをオフにすればOK。
別でボタンなどのパーツが必要なときは別途Canvasを作ってそっちのGraphic RaycasterをONにしておけばタッチが効くパーツとタッチの必要のないパーツがCanvasで分けられる。

>>サンプルプロジェクトダウンロード

VideoEventのバッティング

動画の拡縮の際に通常のflv埋め込みだとジャギーが目立った。
どうやらFLVPlaybackを使うことでアンチエイリアスを使えるようになるみたい。
fl.video.VideoPlayer#smoothing

小さなプロジェクトだったのでタイムラインにコードを直書きしていたら

シーン 1, レイヤー ‘レイヤー 2′, フレーム 1、行 18、列 46 1119: 未定義である可能性が高いプロパティ COMPLETE に静的型 Class の参照を使用してアクセスしています。

こんな感じのエラーがでた。

どうも
flash.events.VideoEvent

fl.video.VideoEvent
がバッティングしているためだった。
タイムラインにスクリプトを書くと自動でflash.以下すべて(?)のパッケージが自動でインポートされるためそちらが優先されていたみたい。
なので、fl.video.VideoEvent.COMPLETEとフルのネームスペースを書いて解決できた。

64bit(arm64)対応の際の動的メソッドの呼び出し

64bit化に対応する際にちょっとハマったので調べてみたら、動的にメソッドを呼ぶ際の呼び出し方に対応が必要そうだった。
もともとのソースは。

Method method = class_getInstanceMethod([self->object class], self->selector);
IMP callback = method_getImplementation(method);
callback(self->object, self->selector, [[NSNumber alloc] initWithInt:1]);

もしくは

objc_msgSend(self->object, self->selector, [[NSNumber alloc] initWithInt:1])

こんなコードはパラメータで渡したオブジェクトがうまく渡らずEXEC_BAD_ACCESSで落ちてしまった。
それを

((void(*)(id, SEL, id))objc_msgSend)(self->object, self->success, [[NSNumber alloc] initWithInt:1]);

このように変えたらうまく動いた。

あと、「Implicitly declaring library function ‘objc_msgSend’ with type ‘id (id, SEL, …)’」というワーニングが出てたけど
#import <objc/runtime.h>
としているところを
#import <objc/message.h>
と変えたらワーニングも消えた。

参考)
Over&Out その後 | 【iOS7】AsyncImageView が arm64 でクラッシュする件Add Star