You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity跳跃/攻击状态下禁用指定脚本、实现落地延迟射击方法

实现方案

两种方案均不改动现有3个脚本的核心逻辑、API调用、原有结构,仅新增少量状态判断代码即可实现需求。

方案1:特定动作执行期间禁用指定脚本

Unity中MonoBehaviour的enabled属性设为false时,脚本的Update、FixedUpdate等生命周期函数会停止执行,直接实现逻辑禁用,侵入性极低:

  1. 先给状态源脚本加公开状态标记,不改动原有逻辑:
    • 在PlayerMovement脚本的变量声明区域新增:
      public bool IsInAir { get; private set; }
      
      在原有起跳逻辑的触发位置(比如给刚体加向上力的代码行之后)加IsInAir = true;,在原有落地检测的触发位置(比如检测到地面接触的逻辑块里)加IsInAir = false;
    • 在负责近战逻辑的Shoot脚本变量声明区域新增:
      public bool IsMeleeAttacking { get; private set; }
      
      在原有近战连击启动的代码位置加IsMeleeAttacking = true;,在连击动画结束的回调/连击逻辑收尾的位置加IsMeleeAttacking = false;
  2. 脚本引用拉取:在ProjectileGunTutorial脚本里声明两个变量,提前在Inspector拖拽对应组件赋值,或者在Start()里用GetComponent获取:
    private PlayerMovement _playerMovement;
    private Shoot _meleeScript;
    
  3. 加拦截判断:在ProjectileGunTutorial的Update方法最开头加一行判断,处于禁射状态直接return,不执行后续射击、换弹、后坐力相关逻辑:
    void Update()
    {
        // 新增这行即可,原有所有逻辑放在后面不动
        if (_playerMovement.IsInAir || _meleeScript.IsMeleeAttacking) return;
        
        //  --- 原有的所有Update内代码全部保持原样,不要修改 ---
    }
    

如果需要在特定动作时禁用近战脚本,逻辑完全一致,加对应状态判断控制enabled属性或者加return拦截即可。

方案2:空中触发的射击指令缓存,落地后自动执行

不需要禁用脚本,只需要把空中点击的射击指令存成标记,落地后自动触发,完全保留玩家输入:

  1. 复用方案1里给PlayerMovement、Shoot脚本加的IsInAir、IsMeleeAttacking状态标记,不需要额外改状态逻辑。
  2. 在ProjectileGunTutorial脚本里新增一个缓存标记:
    private bool _pendingShoot = false;
    
  3. 修改射击输入的判断逻辑,原有射击核心方法完全不动:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 20:27:26