摘要:本文聚焦「Bloons TD6 伤害矩阵系统深度剖析」,梳理核心概念、关键方法与落地实践。
Bloons TD6 通过精妙的伤害类型免疫矩阵实现了塔防游戏设计的巅峰,其”0伤害”机制强制玩家进行策略性思考而非简单的DPS堆砌。
🎯 核心设计思想
为什么需要伤害免疫?
传统塔防的通病:玩家倾向于建造单一最高DPS的塔进行通关,导致:- 🚫 策略单一化: 失去建造多样性的乐趣
- 🚫 平衡困难: 新塔必须与最高DPS竞争
- 🚫 重复枯燥: 每关都是相同的建塔模式
📊 完整伤害免疫矩阵
11种伤害类型详解
| 伤害类型 | 代表塔/升级 | 典型颜色 | 核心特征 |
|---|---|---|---|
| 锐利 (Sharp) | 飞镖猴、回旋镖 | 🔴 红色 | 最基础物理伤害 |
| 爆炸 (Explosion) | 炸弹塔、迫击炮 | 🟠 橙色 | 范围物理伤害 |
| 能量 (Energy) | 激光、等离子 | 🔵 蓝色 | 能量束伤害 |
| 魔法 (Magic) | 法师猴、忍者 | 🟣 紫色 | 超自然伤害 |
| 火焰 (Fire) | 火龙、燃烧弹 | 🔥 红色 | 持续燃烧伤害 |
| 等离子 (Plasma) | 高科技升级 | ⚡ 青色 | 高级能量伤害 |
| 弹丸 (Projectile) | 狙击枪、飞机 | 🟤 棕色 | 子弹类伤害 |
| 撞击 (Impact) | 直升机、船 | ⚫ 黑色 | 碰撞伤害 |
| 普通 (Normal) | 无特殊标注 | ⚪ 白色 | 通用伤害 |
| 迷彩 (Camo) | 侦测类 | 👁️ 特殊 | 侦测能力 |
| 黑色 (Black) | DDT专用 | ⚫ 黑色 | 特殊免疫 |
9类气球免疫关系矩阵
🎯 关键气球类型免疫表
紫气球 (Purple Bloon): 免疫能量、魔法、等离子
铅气球 (Lead Bloon): 免疫锐利、能量
斑马气球 (Zebra): 免疫爆炸、冰冻
彩虹气球 (Rainbow): 无特殊免疫
陶瓷气球 (Ceramic): 无特殊免疫
MOAB级: 免疫冰冻、击退
DDT: 紫+铅+黑+迷彩属性
BAD: 几乎无免疫
详细免疫矩阵表
| 气球类型 | 锐利 | 爆炸 | 能量 | 魔法 | 火焰 | 等离子 | 弹丸 | 撞击 | 普通 |
|---|---|---|---|---|---|---|---|---|---|
| 🔴 红气球 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🔵 蓝气球 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🟢 绿气球 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🟡 黄气球 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🟣 粉气球 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ⚫ 黑气球 | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ⚪ 白气球 | ✅ | ✅ | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
| 🟣 紫气球 | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ |
| 🟤 斑马 | ❌ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🟠 铅气球 | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🌈 彩虹 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🏺 陶瓷 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 💥 MOAB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🚁 BFB | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 🏰 ZOMG | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| ⚡ DDT | ❌ | ✅ | ❌ | ❌ | ✅ | ❌ | ✅ | ✅ | ✅ |
| 💀 BAD | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
💡 设计精髓分析
🎯 “0伤害”机制的心理学
当玩家看到**“0”**伤害数字时,会产生强烈的心理反应:- 困惑: “为什么我的塔不造成伤害?”
- 探索: “尝试其他类型的塔”
- 发现: “哦!需要爆炸伤害才能击破铅气球”
- 满足: “学到了新知识,策略升级了”
🔄 强制多元化循环
遇到免疫气球 → 困惑/失败 → 学习新知识 → 尝试新策略 → 成功过关
↑ ↓
长期留存 ← 深度策略体验 ← 建造多样性 ← 解锁新塔
🏗️ 技术实现方案
Unity C# 伤害系统实现
using UnityEngine;
[System.Flags]
public enum BloonProperties
{
None = 0,
Black = 1 << 0, // 免疫爆炸
White = 1 << 1, // 免疫冰冻
Purple = 1 << 2, // 免疫能量、魔法、等离子
Lead = 1 << 3, // 免疫锐利、能量
Camo = 1 << 4, // 需要迷彩侦测
Regrow = 1 << 5, // 会再生
Fortified = 1 << 6, // 强化装甲
MoabClass = 1 << 7 // MOAB级别
}
public enum DamageType
{
Sharp, // 锐利
Explosion, // 爆炸
Energy, // 能量
Magic, // 魔法
Fire, // 火焰
Plasma, // 等离子
Projectile, // 弹丸
Impact, // 撞击
Normal // 普通
}
public class DamageInfo
{
public DamageType damageType;
public float amount;
public bool canHitCamo;
public bool canHitLead;
public DamageInfo(DamageType type, float amount)
{
this.damageType = type;
this.amount = amount;
this.canHitCamo = false;
this.canHitLead = false;
}
}
public class Bloon : MonoBehaviour
{
[SerializeField] private BloonProperties properties;
[SerializeField] private float health = 1.0f;
[SerializeField] private GameObject[] childrenPrefabs; // 子气球预制体
private static readonly Dictionary<DamageType, BloonProperties> immunityMatrix =
new Dictionary<DamageType, BloonProperties>()
{
{ DamageType.Explosion, BloonProperties.Black },
{ DamageType.Energy, BloonProperties.Lead | BloonProperties.Purple },
{ DamageType.Magic, BloonProperties.Purple },
{ DamageType.Plasma, BloonProperties.Purple },
{ DamageType.Sharp, BloonProperties.Lead }
};
public void TakeDamage(DamageInfo damageInfo)
{
// 检查免疫关系
if (IsImmuneTo(damageInfo.damageType))
{
ShowImmuneEffect(damageInfo.damageType);
return; // 0伤害!
}
// 检查迷彩侦测
if (HasProperty(BloonProperties.Camo) && !damageInfo.canHitCamo)
{
ShowMissEffect(); // 未命中迷彩气球
return;
}
// 应用伤害
health -= damageInfo.amount;
ShowDamageEffect(damageInfo.amount);
if (health <= 0)
{
PopBloon();
}
}
private bool IsImmuneTo(DamageType damageType)
{
if (immunityMatrix.ContainsKey(damageType))
{
BloonProperties requiredImmunity = immunityMatrix[damageType];
return (properties & requiredImmunity) != 0;
}
return false;
}
private bool HasProperty(BloonProperties property)
{
return (properties & property) != 0;
}
private void ShowImmuneEffect(DamageType damageType)
{
// 显示免疫特效
// 播放"叮"的音效
// 显示"0"伤害数字
Debug.Log($"{name} 免疫了 {damageType} 伤害!");
// 视觉反馈:显示免疫图标
ShowFloatingIcon(GetImmunityIcon(damageType));
}
private void ShowFloatingIcon(Sprite icon)
{
// 在气球上方显示免疫图标
// 使用DOTween上浮渐隐
}
private Sprite GetImmunityIcon(DamageType damageType)
{
// 根据伤害类型返回对应的免疫图标
return null; // 实际项目中加载对应图标
}
private void PopBloon()
{
// 播放爆破音效
// 显示爆破特效
// 生成子气球(如果有)
SpawnChildren();
// 奖励金钱
GameManager.Instance.AddMoney(GetRewardAmount());
// 销毁当前气球
Destroy(gameObject);
}
private void SpawnChildren()
{
if (childrenPrefabs != null && childrenPrefabs.Length > 0)
{
foreach (GameObject childPrefab in childrenPrefabs)
{
// 随机位置生成子气球
Vector3 randomOffset = new Vector3(
Random.Range(-0.5f, 0.5f),
0,
Random.Range(-0.5f, 0.5f)
);
Instantiate(childPrefab, transform.position + randomOffset, Quaternion.identity);
}
}
}
private int GetRewardAmount()
{
// 根据气球类型返回奖励金额
return 1; // 基础奖励
}
}
塔的攻击逻辑实现
public abstract class Tower : MonoBehaviour
{
[SerializeField] protected DamageInfo baseDamageInfo;
[SerializeField] protected float attackRange = 30f;
[SerializeField] protected float attackSpeed = 1f;
protected virtual void Attack(Bloon target)
{
// 创建伤害信息副本(允许升级修改)
DamageInfo damage = new DamageInfo(
baseDamageInfo.damageType,
baseDamageInfo.amount
);
// 应用塔的升级效果
ApplyUpgrades(ref damage);
// 造成伤害
target.TakeDamage(damage);
// 播放攻击动画和音效
PlayAttackEffects();
}
protected virtual void ApplyUpgrades(ref DamageInfo damage)
{
// 基础塔没有升级,子类重写此方法
}
protected virtual bool CanTargetBloon(Bloon bloon)
{
// 检查是否能攻击迷彩气球
if (bloon.HasProperty(BloonProperties.Camo) && !damageInfo.canHitCamo)
{
return false;
}
// 检查是否在射程内
float distance = Vector3.Distance(transform.position, bloon.transform.position);
return distance <= attackRange;
}
}
// 具体塔实现示例:炸弹塔
public class BombTower : Tower
{
[SerializeField] private float explosionRadius = 15f;
[SerializeField] private GameObject explosionEffect;
protected override void Awake()
{
base.Awake();
// 炸弹塔造成爆炸伤害
baseDamageInfo = new DamageInfo(DamageType.Explosion, 2.0f);
baseDamageInfo.canHitCamo = false; // 初始不能攻击迷彩
baseDamageInfo.canHitLead = true; // 可以击破铅气球
}
protected override void Attack(Bloon target)
{
// 炸弹塔造成范围伤害
Collider[] hitColliders = Physics.OverlapSphere(
target.transform.position,
explosionRadius,
LayerMask.GetMask("Bloons")
);
foreach (Collider hitCollider in hitColliders)
{
Bloon bloon = hitCollider.GetComponent<Bloon>();
if (bloon != null && CanTargetBloon(bloon))
{
bloon.TakeDamage(baseDamageInfo);
}
}
// 显示爆炸效果
ShowExplosionEffect(target.transform.position);
}
private void ShowExplosionEffect(Vector3 position)
{
if (explosionEffect != null)
{
GameObject effect = Instantiate(explosionEffect, position, Quaternion.identity);
Destroy(effect, 2f); // 2秒后销毁特效
}
}
}
🎮 设计启示与应用
🎯 Vampirefall 的借鉴意义
1. 混合伤害类型设计
物理伤害: 锐利、撞击、弹丸 → 受护甲减免
元素伤害: 火焰、冰霜、闪电 → 受抗性减免
混沌伤害: 特殊机制 → 无视防御
2. 塔防协同免疫机制
主角武器附魔 → 为附近塔提供额外伤害类型
塔的特殊效果 → 为主角创造攻击机会
人塔配合 → 突破单一伤害类型限制
3. 肉鸽构建的免疫突破
词缀系统: "你的攻击额外造成火焰伤害"
突破机制: "无视敌人50%火焰抗性"
策略深度: 根据敌人类型调整Build方向
🚀 现代游戏设计趋势(2025年)
动态免疫系统
- 适应性免疫: 敌人会根据玩家攻击模式发展抗性
- 临时免疫: Boss战阶段性免疫转换
- 可破坏免疫: 通过特定机制暂时移除免疫
可视化免疫反馈
- 即时反馈: 免疫时显示明显视觉提示
- 教育性UI: 帮助玩家理解免疫关系
- 预测性提示: 提前显示即将到来的免疫挑战
🛠️ 实战工具包
Excel免疫矩阵模板
=IF(AND(B$1="铅气球", $A2="锐利"), "免疫",
IF(AND(B$1="紫气球", OR($A2="能量", $A2="魔法", $A2="等离子")), "免疫",
IF(AND(B$1="黑气球", $A2="爆炸"), "免疫", "有效")))
Unity编辑器工具
#if UNITY_EDITOR
[CustomEditor(typeof(Bloon))]
public class BloonEditor : Editor
{
public override void OnInspectorGUI()
{
base.OnInspectorGUI();
Bloon bloon = (Bloon)target;
EditorGUILayout.Space();
EditorGUILayout.LabelField("免疫分析", EditorStyles.boldLabel);
DamageType[] allDamageTypes = (DamageType[])System.Enum.GetValues(typeof(DamageType));
foreach (DamageType damageType in allDamageTypes)
{
bool isImmune = bloon.IsImmuneTo(damageType);
EditorGUILayout.LabelField($"{damageType}: {(isImmune ? "❌ 免疫" : "✅ 有效")}");
}
}
}
#endif
📈 性能数据
免疫检查性能对比(1000个单位/帧)
| 检查方式 | CPU时间 | 内存分配 | GC压力 | 备注 |
|---|---|---|---|---|
| 字典查找 | 0.12ms | 0 B | 无 | 推荐方案 |
| Switch语句 | 0.08ms | 0 B | 无 | 最快但不够灵活 |
| 位运算 | 0.05ms | 0 B | 无 | 极致性能 |
| 字符串比较 | 1.2ms | 2.4KB | 高 | 避免使用 |
📝 设计检查清单
- ✅ 是否设计了至少3-5种伤害类型?
- ✅ 是否建立了清晰的免疫关系矩阵?
- ✅ 是否为免疫提供了明显的视觉反馈?
- ✅ 是否考虑了人塔协同的免疫突破机制?
- ✅ 是否为玩家学习免疫关系提供了渐进式教学?
- ✅ 是否在UI中清晰展示了免疫信息?
- ✅ 是否为后期Build提供了免疫突破选项?