// 武器零件基类
public abstract class WeaponPart : ScriptableObject {
public string partName;
public PartRarity rarity;
public Sprite icon;
}
// 零件稀有度
public enum PartRarity {
Common, // 普通
Rare, // 稀有
Epic, // 史诗
Legendary // 传说
}
// 发射器零件
[CreateAssetMenu(fileName = "Emitter", menuName = "Weapon/Emitter")]
public class EmitterPart : WeaponPart {
public EmitterType type;
public int projectileCount; // 发射数量
public float spreadAngle; // 散布角度
}
public enum EmitterType {
Single, // 单发
Spread, // 散射
Ring, // 环形
Wave // 波浪
}
// 弹道零件
[CreateAssetMenu(fileName = "Projectile", menuName = "Weapon/Projectile")]
public class ProjectilePart : WeaponPart {
public ProjectileType type;
public GameObject prefab;
public int baseDamage;
public float speed;
}
public enum ProjectileType {
Fireball, // 火球
Lightning, // 闪电
IceShard, // 冰锥
Poison // 毒液
}
// 效果器零件
[CreateAssetMenu(fileName = "Effect", menuName = "Weapon/Effect")]
public class EffectPart : WeaponPart {
public EffectType type;
public float effectValue; // 效果数值(范围/数量等)
}
public enum EffectType {
Explosion, // 爆炸
Split, // 分裂
Homing, // 追踪
Pierce // 穿透
}
// 武器组装器
[System.Serializable]
public class WeaponAssembly {
public EmitterPart emitter;
public ProjectilePart projectile;
public List<EffectPart> effects = new List<EffectPart>(); // 可以有多个效果
// 计算总伤害
public int CalculateDamage() {
int baseDmg = projectile.baseDamage;
// 发射器倍率
float emitterMult = emitter.projectileCount;
// 效果倍率
float effectMult = 1.0f;
foreach (var effect in effects) {
if (effect.type == EffectType.Explosion) effectMult *= 2.0f;
if (effect.type == EffectType.Split) effectMult *= 1.5f;
}
// 稀有度加成
float rarityBonus = GetRarityBonus();
return Mathf.RoundToInt(baseDmg * emitterMult * effectMult * rarityBonus);
}
// 稀有度加成
private float GetRarityBonus() {
float bonus = 1.0f;
if (emitter.rarity == PartRarity.Legendary) bonus += 2.0f;
if (projectile.rarity == PartRarity.Legendary) bonus += 2.0f;
foreach (var effect in effects) {
if (effect.rarity == PartRarity.Legendary) bonus += 2.0f;
}
return bonus;
}
}