分享我的塔防游戏中的敌人AI实现。希望能添加除了“沿着路径走”的行为之外的多样化行为。

演示:https://games.xgallery.online/tower-defense/

飞行单位:

bats在地面上飞行,忽视路径障碍物。使用简单的正弦波垂直运动实现:

如果 (enemy.flying) {
  const baseY = 0.8
  const 飞行 = Math.sin(Date.now() * 0.005 + enemy.id) * 0.2
  enemy.mesh.position.y = baseY + hover
}

每个苍蝇都有一个独特的相位偏移(enemy.id),避免它们同步呼吸。

地面单位跳跃:

路径上有装饰性的岩石可以让地面单位自动跳过它们。检测附近的障碍物并应用抛物线跳跃:

对于 (const obstacle of obstacles) {
  const dist = distance(enemy.pos, obstacle.pos)
  如果 (dist < JUMP_RADIUS) {
    const t = 1 - dist / JUMP_RADIUS
    jumpHeight = Math.sin(t * Math.PI) * MAX_JUMP
  }
}

击中反馈:

当受到伤害时,敌人会闪烁并更新生命条。闪烁只是对于100ms的物质颜色改变:

mesh.traverse(child =&gt; {
  如果 (child.isMesh) {
    const 原产地 = child.material.color.getHex()
    child.material.color.setHex(0xffffff)
    setTimeout(() =&gt; child.material.color.setHex(original), 100)
  }
})

生命条是分离的网格parented到场景(而不是敌人)中,尽量避免缩放问题。Always billboard来Facing 相机。

方向:

敌人通过使用atan2的路径切线来旋转到面向运动方向:

const dx = nextPos.x - currentPos.x
const dz = nextPos.z - currentPos.z
enemy.rotation.y = Math.atan2(dx, dz)

所有的敌人模型都使用Meshy AI生成,然后hook到这些行为上。