AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

ThirdPersonShooterを作る(3)

 高低差のある場合に射撃できるようにしました。これまでは同じY座標平面が前提だったので。

 テストするために高低差のあるステージを作ったんですが、なぜか坂を登ってる途中でプレイヤーがすり抜けます。

f:id:yasu9780:20161006013750p:plain
 この坂道を登っている途中でなぜか瞬間的に地面に落ちる(落ちるというか移動する)


 物理エンジンの壁すり抜けは有名なので、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;