高低差のある場合に射撃できるようにしました。これまでは同じY座標平面が前提だったので。
テストするために高低差のあるステージを作ったんですが、なぜか坂を登ってる途中でプレイヤーがすり抜けます。
この坂道を登っている途中でなぜか瞬間的に地面に落ちる(落ちるというか移動する)
物理エンジンの壁すり抜けは有名なので、Collision Detectionなどをいじったり、色々と試したんですが、治りません。
rigidbodyに対して、不作法な座標移動はご法度ということで、rigidbody.MovePositon()を使うように直しました(今はAddForceを使用)。
それでも治りません。
回転が不作法だったってことで、rigidbody.MoveRotation()を使うようにしたら治りました。
ただのすり抜けじゃなくて瞬間移動なので、物理エンジンに不作法をしていたので、内部的に破綻していたみたいです。
ただ、rigidbodyにはLookAt()が無いので困りました。プレイヤーを追いかけてくる処理などで必要ですし。ゾンビを追うにも必要です。
代わりに、ベクトルとベクトルの成す角を求める処理を作ります。
こちらを参考にしました。
www.sousakuba.com
ラジアン角度 =Acos( 単位ベクトルの内積 )
float dot = Vector3.Dot(transform.forward, (new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z) - transform.position).normalized); float sita = Mathf.Acos(dot); avelocity = new Vector3(0,sita,0) * 0.01f; void FixedUpdate() { if (isGround) { rb.AddForce(velocity * 30f * speed, ForceMode.Force); rb.MoveRotation(rb.rotation * Quaternion.Euler(avelocity) ); } }
これでもうまくいきそうだけど、まだうまくいってない
avelocity = Quaternion.LookRotation(new Vector3(target.transform.position.x, transform.position.y, target.transform.position.z) - transform.position).eulerAngles * 0.03f;