Mesh Collider点击一次触发多次日志输出问题求助
Unity点击省份重复打印日志问题解决
问题核心是你的SpaceButton脚本被重复挂载到了62个省份对象上,导致每次点击时,所有62个脚本都会执行Update里的射线检测逻辑,只要射线命中MeshCollider,每个脚本就会打印一次日志,最终出现62次重复输出。
下面提供三种可行的解决方法:
方法1:全局单脚本检测(推荐)
只在一个全局管理对象上挂载检测脚本,避免重复检测:
- 在场景中新建一个空对象(比如命名为
ClickManager) - 移除所有省份对象上的
SpaceButton脚本 - 使用以下脚本替换原代码,挂载到
ClickManager上:
using UnityEngine; public class ClickDetection : MonoBehaviour { private Camera mainCamera; void Start() { mainCamera = Camera.main; } void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out RaycastHit hitInfo) && hitInfo.collider is MeshCollider) { Debug.Log("Clicked on GameObject: " + hitInfo.collider.gameObject.name); } } } }
这样只有一个脚本执行射线检测,点击一次只会输出一次日志。
方法2:限制仅命中自身时打印
如果必须在每个省份上保留脚本,修改判断逻辑,仅当射线命中当前脚本所在对象时才打印:
修改原脚本的条件判断:
void Update() { if (Input.GetMouseButtonDown(0)) { Ray ray = mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if (Physics.Raycast(ray, out hitInfo) && hitInfo.collider is MeshCollider && hitInfo.collider.gameObject == gameObject) { Debug.Log("Clicked on GameObject: " + gameObject.name); } } }
这样点击某个省份时,只有该省份上的脚本会触发打印,其他脚本因未命中自身而跳过。
方法3:使用Unity内置的鼠标点击事件
改用OnMouseDown方法,Unity会自动处理Collider的点击检测,每个对象仅在被点击时触发一次:
替换原脚本内容:
using UnityEngine; public class SpaceButton : MonoBehaviour { void OnMouseDown() { Debug.Log("Clicked on GameObject: " + gameObject.name); } }
这个方法最简洁,不需要手动写射线检测逻辑,完全由Unity封装处理,避免重复触发问题。
内容的提问来源于stack exchange,提问作者Derek Leedberg
相关产品推荐
相关产品推荐

