Tank Battle
11/1/2023
Tank Battle 是我在大一时完成的第一个 Unity 项目。它不仅是一个功能完整的双人对战小游戏,我在后续还折腾了一下 Unity ML-Agents 框架,让它支持智能 AI 对战。
Project Highlights
- Local Multiplayer: 支持本地双人对战, 分用两套操作键位。
- Reinforcement Learning: 集成了 ML-Agents 框架,可以训练出有趣的 AI 对手。
- Full Game Logic: 涵盖了移动、射击、Health、Ammo 管理等一套完整的逻辑。
- Dynamic Camera System: 相机会自动锁定两个玩家,并根据彼此的距离动态缩放视野。
- Audio System: 包含引擎轰鸣、射击、爆炸等丰富的音效。
- Physics System: 基于 Rigidbody 实现,碰撞和运动反馈都比较真实。
Core Modules
1. Movement System
- 基于 Rigidbody 实现平滑的物理移动。
- 完整的 Forward, Backward 和 Steering 控制。
- 会根据坦克的 Idle 或 Moving 状态自动切换引擎音效、产生扬尘效果。
2. Attack System
- 控制 Shell 的发射频率(Cooldown)。
- 弹药管理(初始 30 发)。
- 处理发射点的定位、Projectile 实例化以及射击音效。
3. Health System
- 初始 HP 为 100 点,配套实时显示的 UI Health Bar。
- 每次被击中会计算一个随机伤害(10-20 点)。
- 包含死亡检测和 Game Over 逻辑。
4. ML-Agents Tank Agent
- 实现了 Reinforcement Learning 的 Agent 逻辑。
- 支持 Continuous Actions(移动、转向)和 Discrete Actions(射击)。
- 奖励机制:击中敌人 +1,被击中 -0.5。
- 内置 Heuristic 模式,方便手动测试。
5. Projectile System
- 负责 Collision Detection 和伤害传递。
- 生成爆炸粒子效果和播放音效。
6. Camera Following
- 自动计算两个玩家的中点作为观察中心。
- 正交相机(Orthographic Camera),根据玩家间距动态调整 Size,非常适合这类双人对战视角。
Technical Implementation
ML-Agents Training
在训练 AI 时,我主要设计了以下环节:
- Observation Space: 包含子弹剩余量等关键游戏状态。
- Action Space:
- 连续动作:控制前进/后退速度、转向角速度。
- 离散动作:触发射击指令。
- Reward Function: 基于命中反馈进行正负强化。
Physics & Audio
- 使用
OnTriggerEnter处理炮弹碰撞。 - 通过修改
rigidbody.velocity和angularVelocity来精准控制坦克。 - 使用
AudioSource组件,并配合AudioSource.PlayClipAtPoint实现 3D 空间音效。
Gameplay
- Battle: 两个玩家在同一台电脑上控制各自的坦克。
- Goal: 利用障碍物躲避攻击,先将对方 HP 扣减至 0 的人获胜。
- Strategy: 弹药是有限的,需要控制好节奏,不能一味盲目开火。
My Reflections
这个项目是我初学Unity跟着教程完成的游戏, 以模仿和尝试为主,收获如下:
- 熟悉了 Unity 的基础组件和 Scripting。
- 学会了如何调试物理引擎(Rigidbody、Collision)。
- 掌握了 UI 系统(Slider 实现血条)和 Audio 系统的集成。
- ML-Agents 强化学习框架。
回头看这个项目,虽然代码还有提升空间,但它让我真正理解了如何从零开始,把一个个零散的脚本组合成一个可玩的系统。
Credits
项目开发过程中主要参考了 B 站的沙漠坦克大战教程,在此感谢教程作者。
← Back to projects