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

Unity按钮按压释放与触发器联动逻辑问题及方案咨询

问题:Unity按钮与触发器联动的逻辑修正

我通过OnPointerDown、OnPointerUp、OnTriggerStay和OnTriggerExit实现按钮点击与穿过对象的联动,预期是对象穿过按钮时,按住按钮才销毁对象。

当前使用的代码:

public void OnPointerDown(PointerEventData eventData)
{
        _isMouseDown = true;
        if (!_isTriggered)
        {
                Debug.Log("Fail!");
        }
}

public void OnPointerUp(PointerEventData eventData)
{
        _isMouseDown = false;
}

private void OnTriggerStay(Collider collision)
{
        _isTriggered = true;
        if (_isMouseDown)
        {
                Destroy(collision.transform.gameObject);
                _isTriggered = false;
        }
}

private void OnTriggerExit(Collider collision)
{
        _isTriggered = false;
}

遇到的问题

  • 按住按钮时,对象一接触触发器就被销毁,不符合"穿过才销毁"的预期
  • 对象即将进入触发器前点击按钮,会同时触发Fail!日志和后续的对象销毁,希望只有无触发器触发时的点击才记录Fail,触发器触发时的点击不记录

我猜想需要跟踪按钮点击时长,通过协程设置_isMouseDown为false,请问此方案是否可行?


解决方案&分析

你的协程方案思路有一定合理性,但更精准的逻辑调整应该围绕点击时机与触发器状态的先后顺序来修正,而不是单纯靠时长控制:

  1. 解决"一接触就销毁"的问题
    不要在OnTriggerStay里直接销毁,而是记录当前处于触发器内的对象,只有当按住按钮的同时,对象完成"进入-离开"触发器的穿过动作,才在OnTriggerExit时销毁对象:

    private Collider _currentTriggeredCollider;
    private bool _isMouseDown;
    
    public void OnPointerDown(PointerEventData eventData)
    {
            _isMouseDown = true;
            // 只有当前没有对象在触发器内时,才打印Fail
            if (_currentTriggeredCollider == null)
            {
                    Debug.Log("Fail!");
            }
    }
    
    public void OnPointerUp(PointerEventData eventData)
    {
            _isMouseDown = false;
    }
    
    private void OnTriggerEnter(Collider collision)
    {
            _currentTriggeredCollider = collision;
    }
    
    private void OnTriggerExit(Collider collision)
    {
            // 只有按住按钮的状态下,对象离开触发器才销毁
            if (_isMouseDown && collision == _currentTriggeredCollider)
            {
                    Destroy(collision.gameObject);
            }
            _currentTriggeredCollider = null;
    }
    
  2. 解决"提前点击同时触发Fail和销毁"的问题
    原代码在OnPointerDown时直接判断_isTriggered,但此时对象可能刚进入触发器,状态还没同步。改用_currentTriggeredCollider来判断当前是否有对象在触发器内,只有点击时没有对象在里面,才打印Fail!,避免提前点击后对象进入时的冲突。

  3. 关于协程方案的可行性
    协程控制点击时长的方案可以实现"按住超过一定时间才生效"的逻辑,但并不能直接解决你当前的两个核心问题——它只能过滤短按,无法区分点击时对象是否在触发器内、是否完成穿过动作。所以更推荐上面的逻辑调整方案,如果你需要额外限制点击时长,可以在OnPointerDown中启动协程,延迟设置_isMouseDown为false,但这是附加需求,不是解决当前问题的必要手段。


内容的提问来源于stack exchange,提问作者Operator

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:14