http://qiita.com/fuqunaga/items/45f6db289549cde35af7
の続編
transform.localScale.x を -1 にしてスプライトをフリップしてた のがまずかった
http://forum.unity3d.com/threads/217184-OnCollisionExit2D-Issuetransform.localRotation を180度、Y軸回転して対処したった
これはよろしくなかった
Collider2Dがrotationのzしか反映されないので左右非対称な形状だと、
フリップに追従できない
正解はやっぱり
transform.localScale.x を -1 にする
この背景を理解してると
OnCollisionStay2D()、OnCollisionExit2D()が呼ばれない
のもなんとなく納得ができる
つまり、Collider2Dの形状が変わる(左右反転)からCollision2Dも新たに生成されてる、と
これはtransform.localScaleに値を代入する処理がトリガーになってるっぽくって、
同じ値を代入しなおしても上記2つの関数が発生しない模様
(値の変更の有無にかかわらず毎フレーム代入してるコードだったのでOnCollisionEnter2D()以外が
常に発生しなかった)
これ理解してないときに値が違うときにだけ代入するコードだったら、だいぶわかりにくいバグになってたな・・・