KarakuraiWorks開発記#1|UnityでAI戦車を動かす!詰まった点と改善の工夫【コード付き】

Movie

はじめに

KarakuraiWorksでは、AI戦車同士がバトルする動画をUnityで制作しています。この記事では、戦車の移動と射撃の挙動において詰まった点と、その対処法を紹介します。

詰まったポイント1:戦車の方向転換がガタガタする

AI戦車が移動中に方向を頻繁に変えると、スプライトがガタガタと切り替わってしまい、見た目に違和感が出ます。

対処法:一定間隔でのみ方向転換

以下のように directionChangeInterval を導入し、短時間での切り替えを抑制しました。

private float directionChangeInterval = 0.2f;
private float lastDirectionChangeTime = 0f;

void ChooseNewDirection(float angle)
{
    if (Time.time - lastDirectionChangeTime < directionChangeInterval)
        return;
    ...
    lastDirectionChangeTime = Time.time;
}

詰まったポイント2:敵との距離が近すぎると重なってしまう

ランダム移動だけでは、敵と接近しすぎて不自然に重なることがありました。

対処法:敵が近ければ逆方向へ逃げる

以下のように敵との距離を確認し、距離が近ければ逆方向へ逃げるようにしました。

foreach (GameObject tank in allTanks)
{
    float distance = Vector3.Distance(transform.position, tank.transform.position);
    if (distance < 2f)
    {
        Vector3 away = (transform.position - tank.transform.position).normalized;
        angle = Mathf.Atan2(away.y, away.x) * Mathf.Rad2Deg;
        break;
    }
}

詰まったポイント3:射撃と移動の同時処理でカクつく

弾を発射しながら移動すると不自然だったため、発射中は移動を止める必要がありました。

対処法:isFiringフラグとコルーチンで制御

private bool isFiring;

void FireNormalBullet()
{
    ...
    isFiring = true;
    StartCoroutine(ResumeMovementAfterBullet());
}

IEnumerator ResumeMovementAfterBullet()
{
    yield return new WaitForSeconds(fireInterval + 1f);
    isFiring = false;
}

おわりに

このように細かい制御を重ねることで、「見て気持ちいいAI戦車バトル」に近づいてきました。次回は、弾の管理や回復ロジック、ランチャーの設置で苦戦した点をご紹介します。

コメント

タイトルとURLをコピーしました