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

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

スムーズな回転、視野角のチェック

f:id:yasu9780:20150426002714p:plain

ゾンビが向かってくるように変更(AIMING)
ただしHPが70%切ると今度は逃げ出す(AVOID)

今まで回転はいきなりRotateしてたんですが、
ゾンビが逃げる処理を入れると囲まれた時に、
逃げる対象が頻繁に切り替わってスピン回転するようになったので、
スムーズに回転する処理を入れてみました。

private void SmoothEscapeAt(GameObject target)
{
  Vector3 newRotation = Quaternion.LookRotation(
    transform.position -  target.transform.position ).eulerAngles;
  newRotation.x = 0;
  newRotation.z = 0;
  transform.rotation = Quaternion.Slerp(transform.rotation,
    Quaternion.Euler(newRotation)
    ,3f*Time.deltaTime);
}

QuaternionでY軸回転限定で、相手から間逆で離れる方向に、Slerpで徐々に変化

逃げるだけの場合じゃなくて、向かう場合のLookAtもSmoothに変更したら、
今度は相手がいない方向に蹴り始めました。
距離は射程内なんですが、
今までは即回転だから一回で相手のほうを向いていたので、距離だけチェックでよかったんですね。

仕方がないので、ちゃんと自分の向いている方向から相手のいる方向への角度を調べました

Vector3 forward = transform.TransformDirection(Vector3.forward);
Vector3 targetDirection = targetObj.transform.position - transform.position;	
float angle = Vector3.Angle(forward, targetDirection);

これでangle<80ぐらいなら、視野角におさまるので蹴ってOK
逆に90超えたら、相手は見えないので蹴らない。
みたいな感じ。

Angleの定義は、
Unity - スクリプティング API: Vector3.Angle

角度は常に2つのベクトル間の 鋭角 を返します。(すなわち、必ず角度は180度未満)

マイナスは無いので、Angle<80で左右の視界内が表せるはず。

だいぶ見てて面白い戦いになってきました。
今度はゾンビも襲ってくるようにしてみましょう。