KarakuraiWorks開発記#2|弾種制御とリロード演出でハマったこと【Unity×AI戦車】

Movie

はじめに

この記事では、KarakuraiWorksで使用している「通常弾・回復弾の使い分け」や「リロード処理」「UI表示」に関して、実装時に詰まった点とその解決策をコード付きで紹介します。

詰まったポイント1:弾種(通常弾/回復弾)の選び方

AIに回復弾を撃たせる場面で「誰をターゲットにするか」「向きをどう変えるか」などが複雑化し、コードが煩雑になりました。

対処法:FireBullet()から弾種ごとに分岐

void FireBullet()
{
    if (remainingBullets > 0)
    {
        FireNormalBullet(); // 敵へ攻撃
    }
    else if (remainingRecoveryBullets > 0)
    {
        FireRecoveryBullet(); // 味方を回復
    }
}

また、ターゲットは GetTargetTank(true)GetTargetTank(false) にて自動選定しています。

GameObject GetTargetTank(bool isFriendly)
{
    string targetTag = (isFriendly) ? myTeam : (myTeam == "Red" ? "Blue" : "Red");
    GameObject[] allTanks = GameObject.FindGameObjectsWithTag(targetTag);
    ...
    return allTanks[Random.Range(0, allTanks.Length)];
}

詰まったポイント2:残弾数のUI表示が戦車からズレる

TextMeshProUGUIで残弾数を表示していましたが、戦車の移動に追従せず、見失ってしまうケースが発生。

対処法:毎フレームUI位置をスクリーン座標で更新

void UpdatebulletTextPosition()
{
    bulletCountText.rectTransform.rotation = Quaternion.Euler(0, 0, 0);
    Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
    bulletCountText.transform.position = screenPos + new Vector3(0, 80, 0);
}

同様に、体力バー(Slider)の位置も UpdateHealthBarPosition() で毎フレーム調整。

詰まったポイント3:リロード用ボールの視認性・演出不足

リロードボールに「どれだけ弾が補充されるか」を視覚的に表現したかったのですが、透明度やテキストがうまく反映されず困りました。

対処法:透明度とTextMeshProで見せる

void UpdateBallVisuals()
{
    float alpha = Mathf.Clamp01(reloadBulletAmount / 100f);
    Color iconColor = effectSpriteRenderer.color;
    iconColor.a = alpha;
    effectSpriteRenderer.color = iconColor;
}

加えて、UI表示用テキストは reloadText をスクリーン座標で追従させています。

void UpdateReloadTextPosition()
{
    reloadText.text = reloadBulletAmount.ToString();
    reloadText.rectTransform.rotation = Quaternion.Euler(0, 0, 0);
    Vector3 screenPos = Camera.main.WorldToScreenPoint(transform.position);
    reloadText.transform.position = screenPos;
}

おわりに

今回は、AI戦車の弾管理とリロード演出にまつわる細かなハマりポイントを解説しました。動画として「わかりやすく・見ていて楽しい」演出を目指す中で、UIとゲームロジックの連携に気を配る必要がありました。

コメント

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