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(更适配瞄准类游戏)
如果调整热点后仍有问题,或者想彻底规避光标相关的检测偏差,推荐直接从屏幕中心发射射线检测球体——瞄准类游戏的十字准星通常固定在屏幕中心,这种方式更可靠。
修改方案:
- 修改球体脚本,将
startTime改为public,并移除OnMouseDown方法 - 创建
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
相关产品推荐
相关产品推荐

