isTriggerが有りの状態で壁に当たったらしい物体を反射させる

環境

Unity 2019.1.1f1

目標

ある物体が床とか壁のオブジェクトに当たったら反射して進むようにする

前提条件

ただし、どの物体もisTriggerがOnである
ある物体にはRigidbodyがアタッチされている
ある物体はRigidbodyのvelocityで動いている(positionを毎フレーム動かす処理をしていない)

内容

様々な事情で物理挙動をoffにしている場合に
反射っぽい動きを実現する方法

以下の通り

Rigidbody rb;
float speed;
void OnTriggerEnter(Collider other){
    //1.動いてる物体(this)と当たる物体(other)から反射ベクトルをとる
    Vector3 reflectVec = Vector3.Reflect(this.transform.forward, other.transform.up);
    //2.動いてる物体のrotationを変更する
    this.transform.rotation = Quaternion.LookRotation(reflectVec.normalized);
    //3.動いてる物体のrigidbodyのベロシティを変更する
    rb.velocity = speed * this.transform.forward;
}

で、こんな感じのができるはずたぶん
(当たり判定が雑過ぎて当たる前に反射して見えるけど問題ない)
f:id:Nsan:20190516203305g:plain


追記:
ちなみに大人しくisTriggerをoffにしてやった方が楽
衝突したcollisionのcontactsにnormalっていうのがあるから
それとthis.transform.forwardの反射ベクトルをとればいい