Unity中2D简单近战攻击实现失败问题求助
Unity中2D简单近战攻击实现失败问题求助
兄弟,我太懂你这种刚做近战攻击踩坑的感觉了!咱们一步步拆解你的问题,帮你搞定这个简单的敌人销毁逻辑~
先说说你当前代码和操作里的几个核心问题:
- 销毁对象的代码写错了:你现在
Destroy(other)销毁的是碰撞体组件,不是敌人整个游戏对象!得改成Destroy(other.gameObject)才会把敌人删掉。 - 触发检测的前提没满足:
OnTriggerEnter(2D项目要对应OnTriggerEnter2D)能触发的话,必须同时满足这几个条件:- 攻击方(比如你的剑)和敌人都有对应的碰撞体组件(3D用
Collider,2D用Collider2D) - 其中至少一个碰撞体勾了「Is Trigger」选项
- 双方中至少有一个对象带刚体组件(3D
Rigidbody/2DRigidbody2D),而且不能是静态对象(静态的话触发检测会失效)
- 攻击方(比如你的剑)和敌人都有对应的碰撞体组件(3D用
- 动画事件的用法错了:你不能直接把脚本“挂”到动画事件上,动画事件是用来在动画播放到指定帧时调用脚本里的公开方法的,不是挂载脚本的载体。
给你一套能跑通的实现方案,兼顾你想“只在挥剑时生效”的需求:
1. 先调整你的脚本(以3D为例,2D的话把组件换成2D版本就行)
public class SwordAttack : MonoBehaviour { private Collider _attackHitbox; void Awake() { // 获取攻击碰撞体,一开始默认禁用 _attackHitbox = GetComponent<Collider>(); _attackHitbox.enabled = false; } // 给动画事件调用的方法:开启攻击判定 public void EnableAttackHitbox() { _attackHitbox.enabled = true; } // 给动画事件调用的方法:关闭攻击判定 public void DisableAttackHitbox() { _attackHitbox.enabled = false; } void OnTriggerEnter(Collider other) { // 加个标签判断,避免误销毁自己或其他友方单位 if (other.CompareTag("Enemy")) { Destroy(other.gameObject); // 以后要加死亡动画、击退的话,直接在这里加逻辑就行 } } }
2. 场景里的设置步骤
- 给你的剑(或者玩家身上负责攻击判定的部位)加一个
Collider(比如BoxCollider),勾上「Is Trigger」 - 给剑或者玩家对象加一个
Rigidbody(2D的话用Rigidbody2D),如果是玩家的刚体,记得别设为静态 - 把上面的脚本挂到剑的GameObject上
- 打开你的挥剑动画Clip,在动画刚挥出去的帧添加动画事件:选择剑对象上的
SwordAttack脚本,调用EnableAttackHitbox;在动画挥剑结束的帧添加动画事件,调用DisableAttackHitbox
关于你纠结的几个点:
- 要不要写到玩家主脚本里?完全没必要,把攻击逻辑封装在单独的
SwordAttack脚本里更清晰,玩家脚本只需要负责播放攻击动画就行,剩下的交给动画事件触发。 - 能不能不做单独的Hitbox?理论上可以,但你得把玩家的碰撞体平时禁用,攻击时再开启,但这样很容易影响玩家平时的移动碰撞(比如走路时穿模),还是单独做一个剑的Hitbox更稳妥,也更灵活。
最后提醒下:如果是2D项目,一定要把所有组件换成2D版本(比如Collider2D、OnTriggerEnter2D、Rigidbody2D),别把3D和2D的组件搞混,很多新手都栽在这里!
备注:内容来源于stack exchange,提问作者tai an Zhou
相关产品推荐
相关产品推荐

