OnTriggerEnter2Dで反発処理

昨日の解決編。
やりたいことは、床に衝突した時と左右の壁に衝突した時で異なる反発係数を適応したい。
床と左右の壁で処理を変えるため、左右の壁ではscriptで反発処理をするように変更。

左右の壁のBox Collider 2Dのis Triggerをチェック。

is TriggerをチェックするとCollider2Dをアタッチしたオブジェクト同士でもすり抜けるようになる。
その場合、衝突時にOnTriggerEnter2D、衝突中はフレームごとにOnTriggerStay2D、衝突終了時OnTriggerExit2Dが呼び出される。

反発させたいオブジェクト、Enemyにアタッチしたscript、Enemy.csにコードを書く。

  void OnTriggerEnter2D () {
    // x成分のみ反転
    rigidbody2D.velocity = new Vector2(-rigidbody2D.velocity.x, rigidbody2D.velocity.y);
  }

これで左右の壁に衝突した時はx成分が反転するだけ(実質、反発係数は1)、床に衝突した時はPhysics2DMaterialに設定した反発係数が適応される。

Rigidbody 2Dでオブジェクトをバウンドさせる

Physics2D Materialを使う。
http://docs.unity3d.com/Documentation/Components/class-PhysicsMaterial2D.html

Projectビュー→Create→Physics2D Materialを選択

Inspectorで摩擦係数と反発係数が設定できる。


これを設定したいColliderのMaterialに設定


実行するとColliderが設定されているオブジェクトと衝突したときに反発する。


のは出来たんだけど、このままだと床でも壁でも同じ反発係数で跳ねてしまう。
やりたいのは、床ではある程度減衰するが、壁では減衰無しの反射。
軽く調べてみたけどやり方がわからない。


2DじゃないほうのPhysics MaterialにはBounce Combineというプロパティがあって
衝突した両者の反発係数をもとに新しい反発係数を決められるらしい。
2Dに無いのはこれから実装されていくのかどうなのか。
http://docs.unity3d.com/Documentation/Components/class-PhysicMaterial.html


結局、衝突関係のことを考えると物理演算じゃなくて自前で移動させないといけないのかなー。
やり方があるなら誰か教えてほしい。

Rigidbody 2DとApply Root Motionは併用できない

いろいろ経緯はおいといて

unityの物理演算用component、Rigidbody 2Dを使ったところ
ゆっくり下に動きはするものの、物理演算による落下とはほど遠い挙動。

Rigidbody2Dの方を確認してみても、Gravity Scaleには1が入っているし、問題無さげ。
試しにGravity Scaleを2にしてみたら下に移動する速度は上がったものの、やっぱりおかしい。

で、調べてみた結果、SpriteのアニメーションをやってるAnimatorのApply Root Motionが原因だったらしい。

チェックを外して実行してみたらちゃんと落下した。解決。

3DSブラウザの十字キーでオブジェクトを動かせるサンプル

3DSの本体更新が7日にあって、eショップとブラウザが追加された。
3DSのブラウザはflash非対応なので、何かやるとしたらjavascript一択かと。
なのでサンプルを作ってみました。

http://182.48.56.250/

単純にカーソルキーのkeydownイベントを捕まえてるだけですけどね。
一般的なブラウザで起こせるイベントは大抵起こせるっぽい。

今日聴いた曲

  • Haunted Panels (ApertureSciencePsychoacousticsLaboratory) 21:25
  • Ghost of Rattman (ApertureSciencePsychoacousticsLaboratory) 21:24
  • Overgrowth (ApertureSciencePsychoacousticsLaboratory) 21:20
  • Technical Difficulties (ApertureSciencePsychoacousticsLaboratory) 21:17
  • The Courtesy Call (ApertureSciencePsychoacousticsLaboratory) 21:13
  • 9999999 (ApertureSciencePsychoacousticsLaboratory) 21:10
  • Concentration Enhancing Menu Initialiser (ApertureSciencePsychoacousticsLaboratory) 21:07
  • Science is Fun (ApertureSciencePsychoacousticsLaboratory) 21:04
  • Triple Laser Phase (ApertureSciencePsychoacousticsLaboratory) 21:02
  • Comedy = Tragedy + Time (ApertureSciencePsychoacousticsLaboratory) 20:58
  • I Made It All Up (ApertureSciencePsychoacousticsLaboratory) 20:54
  • Turret Wife Serenade (ApertureSciencePsychoacousticsLaboratory) 20:50
  • Adrenal Vapor (ApertureSciencePsychoacousticsLaboratory) 20:48
  • I'm Different (ApertureSciencePsychoacousticsLaboratory) 20:46
  • Three Feet (Pepe California) 17:45
  • Frappe (Pepe California) 17:42
  • In The Sun (Pepe California) 17:25
  • Yoyogi Island Resort (Pepe California) 17:19
  • Get Up! (Clap Your Hands) (Pepe California) 17:16
  • Bikini Rocks (Pepe California) 17:12
  • Young Whistle Young (Pepe California) 17:07
  • 放課後ティータイム (放課後ティータイム) 9:38
  • 冬の日 (放課後ティータイム) 9:32
  • 五月雨20ラブ(#23『放課後!』Mix) (放課後ティータイム) 9:29
  • ぴゅあぴゅあはーと(#23『放課後!』Mix) (放課後ティータイム) 9:24
  • ふわふわ時間(#23『放課後!』Mix) (放課後ティータイム) 9:19
  • 天使にふれたよ! (放課後ティータイム) 9:14

webに眠る何気ないアートを見つけ出すgreasemonkeyスクリプトを作った。

なんでもないような場所にこそ、アートは眠っているものです。
というわけで、日常に眠るアートを見つけ出すgrease monkeyスクリプトを作りました。

インストールは、firefoxにgrease monkeyをインストールした上で以下から。
detect_art

説明

普通にwebっていると、なんの変哲も無いwikipediaの1ページ。

ところがdetect_artを通して見ると、実はこんなにアートが隠れているのです!

味気ない日常にほんの少し彩りを付けてくれる、粋なスクリプトですね。


作っては見たものの、日本語のページだとほとんどアートが見つからないのでテンションが下がったのは秘密ですよ。

nilじゃない場合だけループを実行する。

objects.each do |object|
  p object.name
end

ループ処理を書く際、上のように単純に書くとobjectsがnilの場合に例外が出る。
ただ問題を回避するだけなら生真面目にif文で分岐するだけで良い。

unless objects.blank?
  objects.each do |object|
    p object.name
  end
end

だがしかし野暮ったい。もっとスマートに書く方法なかったっけ?
と思って調べてみるが、見つからない。
rubyのイディオムを網羅的に調べられるサイトってどっかにないのかな。
とにかく見つからないので自分でちょっと試してみたところ、以下のコードで目的の処理が出来た。

(objects || []).each do |object|
  p object.name
end

この書き方はどうなんだろう?
割合スマートだと思うが、もっと良い書き方がどっかにありそうな気もする。