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

Unity中自定义十字准星光标下OnMouseDown无法触发的问题

问题描述

我正在开发一款瞄准类游戏,将鼠标光标替换为十字准星的步骤为:找到十字准星精灵,将其纹理类型设置为Cursor,再在Player Settings中设为默认光标,该十字准星在Unity编辑器的游戏运行中显示正常。

我给每个可射击球体挂载了以下脚本:

using UnityEngine;

public class DestroyOnTouch : MonoBehaviour
{
    public ParticleSystem sphereExplode;
    private float startTime;

    private void Start()
    {
        startTime = Time.time;
    }

    private void Update()
    {
        //Destroy(gameObject, 1.5f);
    }

    private void OnMouseDown()
    {
        float RT = Time.time - startTime;
        if (this.gameObject.GetComponent<Renderer>().material.color == Color.red)
        {
            Stats.redCount++;
            Stats.redRTList.Add(RT);
        }
        else
        {
            Stats.greenCount++;
            Stats.greenRTList.Add(RT);
        }
        Deactivate();
    }
    void Deactivate()
    {
        Instantiate(sphereExplode, transform.position, Quaternion.identity);
        this.gameObject.SetActive(false);
    }
}

使用默认鼠标光标时,点击球体可正常触发销毁逻辑;但使用十字准星光标时,无法触发该逻辑。所有球体均已挂载Sphere Collider组件,请问遗漏了什么?

解决方案

1. 修正十字准星光标热点位置

这是最核心的原因:自定义光标设置时,热点(Hotspot)未对准十字准星的视觉中心。OnMouseDown()的碰撞检测是基于光标热点位置,而非视觉显示位置。如果热点在纹理角落,你看着十字准星中心对准球体,实际点击的却是角落位置,自然碰不到球体的Collider。

解决步骤:

  • 在Unity编辑器中选中十字准星纹理
  • 在Inspector面板的「Cursor Settings」区域,调整Hotspot的X、Y值为纹理尺寸的一半(例如512×512的纹理,设置为256, 256),确保热点与十字准星视觉中心完全重合

2. 改用射线检测替代OnMouseDown(更适配瞄准类游戏)

如果调整热点后仍有问题,或者想彻底规避光标相关的检测偏差,推荐直接从屏幕中心发射射线检测球体——瞄准类游戏的十字准星通常固定在屏幕中心,这种方式更可靠。

修改方案:

  1. 修改球体脚本,将startTime改为public,并移除OnMouseDown方法
  2. 创建ShootingManager脚本挂载到相机或空物体上:
using UnityEngine;

public class ShootingManager : MonoBehaviour
{
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            // 从屏幕中心发射射线
            Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width / 2f, Screen.height / 2f, 0f));
            if (Physics.Raycast(ray, out RaycastHit hitInfo))
            {
                DestroyOnTouch targetScript = hitInfo.collider.GetComponent<DestroyOnTouch>();
                if (targetScript != null)
                {
                    // 执行统计逻辑
                    float reactionTime = Time.time - targetScript.startTime;
                    Renderer targetRenderer = hitInfo.collider.GetComponent<Renderer>();
                    
                    if (targetRenderer.material.color == Color.red)
                    {
                        Stats.redCount++;
                        Stats.redRTList.Add(reactionTime);
                    }
                    else
                    {
                        Stats.greenCount++;
                        Stats.greenRTList.Add(reactionTime);
                    }
                    
                    // 触发销毁特效与隐藏逻辑
                    targetScript.Deactivate();
                }
            }
        }
    }
}

3. 额外检查项

  • 确认球体的Sphere Collider组件处于启用状态,且Is Trigger未勾选(OnMouseDown需要非触发型Collider)
  • 确保没有其他UI元素或物体遮挡球体的Collider检测

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:57:21