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
相关产品推荐
相关产品推荐

