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を選択
実行するとColliderが設定されているオブジェクトと衝突したときに反発する。
のは出来たんだけど、このままだと床でも壁でも同じ反発係数で跳ねてしまう。
やりたいのは、床ではある程度減衰するが、壁では減衰無しの反射。
軽く調べてみたけどやり方がわからない。
2DじゃないほうのPhysics MaterialにはBounce Combineというプロパティがあって
衝突した両者の反発係数をもとに新しい反発係数を決められるらしい。
2Dに無いのはこれから実装されていくのかどうなのか。
http://docs.unity3d.com/Documentation/Components/class-PhysicMaterial.html
結局、衝突関係のことを考えると物理演算じゃなくて自前で移動させないといけないのかなー。
やり方があるなら誰か教えてほしい。
3DSブラウザの十字キーでオブジェクトを動かせるサンプル
3DSの本体更新が7日にあって、eショップとブラウザが追加された。
3DSのブラウザはflash非対応なので、何かやるとしたらjavascript一択かと。
なのでサンプルを作ってみました。
単純にカーソルキーの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
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
この書き方はどうなんだろう?
割合スマートだと思うが、もっと良い書き方がどっかにありそうな気もする。