はじめに
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戦車バトル」に近づいてきました。次回は、弾の管理や回復ロジック、ランチャーの設置で苦戦した点をご紹介します。
コメント