Unity跳跃/攻击状态下禁用指定脚本、实现落地延迟射击方法
实现方案
两种方案均不改动现有3个脚本的核心逻辑、API调用、原有结构,仅新增少量状态判断代码即可实现需求。
方案1:特定动作执行期间禁用指定脚本
Unity中MonoBehaviour的enabled属性设为false时,脚本的Update、FixedUpdate等生命周期函数会停止执行,直接实现逻辑禁用,侵入性极低:
- 先给状态源脚本加公开状态标记,不改动原有逻辑:
- 在
PlayerMovement脚本的变量声明区域新增:
在原有起跳逻辑的触发位置(比如给刚体加向上力的代码行之后)加public bool IsInAir { get; private set; }IsInAir = true;,在原有落地检测的触发位置(比如检测到地面接触的逻辑块里)加IsInAir = false; - 在负责近战逻辑的
Shoot脚本变量声明区域新增:
在原有近战连击启动的代码位置加public bool IsMeleeAttacking { get; private set; }IsMeleeAttacking = true;,在连击动画结束的回调/连击逻辑收尾的位置加IsMeleeAttacking = false;
- 在
- 脚本引用拉取:在
ProjectileGunTutorial脚本里声明两个变量,提前在Inspector拖拽对应组件赋值,或者在Start()里用GetComponent获取:private PlayerMovement _playerMovement; private Shoot _meleeScript; - 加拦截判断:在
ProjectileGunTutorial的Update方法最开头加一行判断,处于禁射状态直接return,不执行后续射击、换弹、后坐力相关逻辑:void Update() { // 新增这行即可,原有所有逻辑放在后面不动 if (_playerMovement.IsInAir || _meleeScript.IsMeleeAttacking) return; // --- 原有的所有Update内代码全部保持原样,不要修改 --- }
如果需要在特定动作时禁用近战脚本,逻辑完全一致,加对应状态判断控制enabled属性或者加return拦截即可。
方案2:空中触发的射击指令缓存,落地后自动执行
不需要禁用脚本,只需要把空中点击的射击指令存成标记,落地后自动触发,完全保留玩家输入:
- 复用方案1里给
PlayerMovement、Shoot脚本加的IsInAir、IsMeleeAttacking状态标记,不需要额外改状态逻辑。 - 在
ProjectileGunTutorial脚本里新增一个缓存标记:private bool _pendingShoot = false; - 修改射击输入的判断逻辑,原有射击核心方法完全不动:
void Update() { // 原有换弹、后坐力相关的非射击触发逻辑全部保持不动 // 替换原有的鼠标左键触发射击的判断块 if (Input.GetMouseButtonDown(0)) { // 处于空中/近战攻击状态时,只存标记不触发射击 if (_playerMovement.IsInAir || _meleeScript.IsMeleeAttacking) { _pendingShoot = true; } else { // 这里放原有的射击调用代码,比如原来的Shoot()方法,原封不动 Shoot(); } } // 新增:每帧检查有没有待触发的射击,满足落地、不在近战状态时自动执行 if (_pendingShoot && !_playerMovement.IsInAir && !_meleeScript.IsMeleeAttacking) { _pendingShoot = false; // 和上面调用同一个原有射击方法,不要改内部逻辑 Shoot(); } // 剩下原有的所有Update代码全部保持原样 }
补充说明:如果需要区分不同动作的拦截规则,比如跳跃时缓存射击、近战攻击时直接禁用射击,只需要调整判断分支的条件即可,不需要改动核心功能代码。
内容的提问来源于stack exchange,提问作者normal person
相关产品推荐
相关产品推荐

