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

Unity中2D多边形碰撞体点击检测:射线检测是否可用?

2D高尔夫球杆头部点击检测:Raycast完全适用!

Raycast在这个场景下完全能用,不过2D场景要注意用Physics2D相关的API,别和3D的搞混了。给你一套新手友好的实现步骤:

一、先检查球杆头部的对象设置

  • 确保Sprite对象上有Polygon Collider 2D组件,且碰撞体形状贴合球杆头部(Inspector里点Edit Collider可以手动拉顶点调整)
  • 关闭Collider组件的Is Trigger选项(单纯点击检测不需要开这个)
  • 给这个对象加个专属标签,比如ClubHead(Inspector顶部Tag下拉选"Add Tag"创建)

二、编写点击检测代码

把下面的脚本挂到主相机或者任意活跃的空对象上就行:

using UnityEngine;

public class ClubClickHandler : MonoBehaviour
{
    void Update()
    {
        // 检测鼠标左键按下
        if (Input.GetMouseButtonDown(0))
        {
            // 把鼠标屏幕坐标转成2D世界坐标
            Vector2 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            
            // 方法1:直接检测点击点下的碰撞体(更适合点击场景)
            Collider2D hitCollider = Physics2D.OverlapPoint(mouseWorldPos);
            if (hitCollider != null && hitCollider.CompareTag("ClubHead"))
            {
                // 这里写点击后的功能
                Debug.Log("成功点击球杆头部!");
                // 比如调用球杆的动作:hitCollider.GetComponent<ClubHeadLogic>().Swing();
            }

            // 方法2:用2D射线检测(和你问的Raycast对应)
            // RaycastHit2D hit = Physics2D.Raycast(mouseWorldPos, Vector2.zero);
            // if (hit && hit.collider.CompareTag("ClubHead"))
            // {
            //     Debug.Log("射线检测到球杆头部!");
            // }
        }
    }
}

三、常见踩坑点(你之前代码无效大概率是这些问题)

  • 用了3D的Physics.Raycast而非2D的Physics2D.Raycast,两者不通用
  • Polygon Collider 2D形状没对齐,导致点击区域不对
  • 开了Is Trigger,但代码没设置检测Trigger的参数
  • 主相机没加MainCamera标签,导致Camera.main找不到相机
  • 2D场景用了透视相机,坐标转换出错(2D游戏建议用正交相机)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 04:17:05