Unityでのイベントの処理

FlashではEventListenerという組み込みの機構があってとても便利に実装できる。Unityではどんな実装が考えられるか試してみた。
例えばステージをクリックすると自身のオブジェクトが回転し、60度以上回転すると自身を破棄するようなものをFlashで実装すると。

package  {
	/**
	 * import.
	 */
	import flash.display.MovieClip;
	import flash.events.MouseEvent;

	/**
	 * イベントテスト。
	 */
	public class EventTest extends MovieClip {
		/**
		 * コンストラクタ。
		 */
		public function EventTest():void {
			// イベント追加
			this.stage.addEventListener(MouseEvent.CLICK, this.onClick);
		}

		/**
		 * クリッイベント。
		 */
		private function onClick(evt:MouseEvent):void {
			this.rotation += 10;
			if (this.rotation >= 60) {
				this.stage.removeEventListener(evt.type, arguments.callee);
				this.parent.removeChild(this);
			}
		}
	}
}

こんな感じ。
Unityでも作ってみました。
>>サンプル

4つともクリックすると回転し、60度より大きく回転するとGameObjectが破棄され、イベントも消される。同じ動きだけど、4つとも違う実装。
Continue…

テクスチャに描画する

image

例えば血しぶきや足跡などをテクスチャの上に乗せるときにどのようにするのが一番いいんだろ??
テクスチャを書き換えてというのはやり方が分からなかったので今回はパッケージのProjectors => Blob Shadowを使ってみた。

Blob Shadowもそれほど軽くはないらしいので、量が多いとモバイルではこの方法は使えないかもしれない。シェーダーとかを書き換えるともう少し軽くなるのですかね(?)
衝突地点にBlob Shadowを置くだけという簡単な方法。テクスチャを用意すれば血しぶきや足跡にも使えそう。今回は元のテクスチャ(円形グラデーション)のものを変えて、青くハッキリした円形のものに変えてみた。テクスチャは読み込んだままではなく、Blob Shadowのテクスチャに合わせて設定を変えた。

なぜかWeb PlayerではBlob Shadowが描画されないので(なぜ…?)今回はgif画像のみ。

>> プロジェクトファイルダウンロード

座標変換:クォータニオン、オイラー角

回転による座標変換について改めて調べてみた。
ちょっと間違ったこともあるかもしれないけど…

まず、回転による座標変換には以下の3つがある。
・変換行列
・オイラー角
・クォータニオン

変換行列はアフィン変換と言われ、回転だけでなく拡縮や移動などの変換も表す4×4の行列。これについては今回は省略。
Continue…

Mecanimを試してみた

image

>>Unityプレーヤーで見る

以前はアニメーション制御にAnimationコンポーネントで作ってみたけど、今回Mecanimを学んでみた。
見た目で状態遷移が分かるのでとてもいいですね。
たまに状態遷移が表示されなくなるのはなんなんだろ。。。(?)

Mecanimの仕組みについてはUnity公式のこちらの動画を見てもらえるとだいたい理解できる。(50分くらいある!)
ソースファイルなんかもYoutubeの説明の蘭にあるのであとで詳しく見てみよう。
Continue…

Apply Root Motion (Animator)

Appy Root Motion

突然アニメーションが動くなったので調べたところ、Animatorでの設定にある「Apply Root Motion」が問題だった。
これはデフォルトでチェックが外れた状態だけど、スクリプト側で動きを付けたいときはONにする。そうするとルートの動き(一番親?)がアニメーションでは反映されなくなる。スクリプトで制御したいとき(位置移動など)に使うものみたい。
そのゲームオブジェクトにアタッチしているスクリプトにOnAnimatorMove()があると、この項目が自動的に右のように「Handled by Script」となる。いったんこの状態となり、OnAnimatorMove()を削除するとApply Root Motion:ONとなることがあるようでこれが原因だった模様。