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

Mesh Collider点击一次触发多次日志输出问题求助

Unity点击省份重复打印日志问题解决

问题核心是你的SpaceButton脚本被重复挂载到了62个省份对象上,导致每次点击时,所有62个脚本都会执行Update里的射线检测逻辑,只要射线命中MeshCollider,每个脚本就会打印一次日志,最终出现62次重复输出。

下面提供三种可行的解决方法:

方法1:全局单脚本检测(推荐)

只在一个全局管理对象上挂载检测脚本,避免重复检测:

  1. 在场景中新建一个空对象(比如命名为ClickManager)
  2. 移除所有省份对象上的SpaceButton脚本
  3. 使用以下脚本替换原代码,挂载到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:14:50