Unity战斗系统开发:敌人受击时如何施加击退力?
Unity 敌人受击击退效果实现方案
要实现敌人受击向后击退的效果,核心逻辑是获取伤害来源的位置,计算远离攻击者的方向后给敌人刚体施加对应冲量,你可以参考以下修改方案:
代码修改部分
首先修改EnemyTakeDmg类的TakeDamage方法,增加伤害来源位置的入参,补充击退逻辑:
public class EnemyTakeDmg : MonoBehaviour { public int health = 8; private Rigidbody myBody; public float knockBackForce = 5f; // 可选:标记是否正在受击击退,用于暂停敌人移动逻辑 public bool isKnockedBack = false; public event System.Action OnDeath; private void Start() { myBody = GetComponent<Rigidbody>(); } public void TakeDamage(int damage, Vector3 attackerPos) { health -= damage; // 击退逻辑 Vector3 knockBackDir = (transform.position - attackerPos).normalized; // 3D项目可选:忽略Y轴分量,避免敌人被向上击飞 knockBackDir.y = 0; myBody.AddForce(knockBackDir * knockBackForce, ForceMode.Impulse); // 可选:标记击退状态,你可以在敌人移动脚本中判断这个状态,击退时不执行移动逻辑 isKnockedBack = true; // 0.2秒后恢复可移动状态,时间可以根据你的游戏节奏调整 Invoke(nameof(ResetKnockBackState), 0.2f); if(health <= 0) { Die(); } } private void ResetKnockBackState() { isKnockedBack = false; } public void Die() { OnDeath?.Invoke(); Destroy(gameObject); } }
调用端修改
在你触发敌人受伤的逻辑处(比如玩家攻击判定的脚本),调用TakeDamage时需要额外传入攻击者的位置参数,示例如下:
// 玩家攻击脚本中的碰撞检测逻辑示例 private void OnTriggerEnter(Collider other) { if(other.CompareTag("Enemy")) { EnemyTakeDmg enemy = other.GetComponent<EnemyTakeDmg>(); if(enemy != null) { // 第二个参数传入玩家自身的位置作为伤害来源位置 enemy.TakeDamage(2, transform.position); } } }
常见问题排查
如果修改后仍无击退效果,可以按以下顺序检查:
- 确认敌人的Rigidbody组件没有勾选
Is Kinematic,勾选后刚体不会响应外力 - 检查Rigidbody的
Mass(质量)参数,如果质量过大,需要对应调大knockBackForce的数值 - 确认方向计算没有写反,如果写成
attackerPos - transform.position敌人会朝攻击者方向移动,而非向后退 - 如果你做的是2D项目,把
Rigidbody替换为Rigidbody2D,AddForce用法保持一致即可 - 如果敌人有持续的移动逻辑,记得在移动脚本中判断
isKnockedBack状态,击退期间不要执行移动赋值,否则移动代码会覆盖击退的力效果
内容的提问来源于stack exchange,提问作者zielu
相关产品推荐
相关产品推荐

