はじめに
この記事では、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とゲームロジックの連携に気を配る必要がありました。
コメント