Completely remove raycast block logic to guarantee ping clicks

This commit is contained in:
yangbear
2026-07-12 03:59:50 +08:00
parent 86a0739fda
commit 50ccb791a4
+12 -17
View File
@@ -23,17 +23,23 @@ public class PingClickHandler : MonoBehaviour
}
// 强行把碰撞体的世界大小固定在一个比较合适的尺寸(比如世界尺寸 0.15)
// 这样无论模型怎么缩放,点击区域都是固定的
// 注意:父级如果在很远的层级里存在极端缩放,这里直接算可能还会出问题
// 所以我们加一个更保守的安全保障:无论算出什么比例,绝对物理半径不能低于 0.05,不能高于 5.0
float scale = Mathf.Max(Mathf.Abs(transform.lossyScale.x), Mathf.Abs(transform.lossyScale.y), Mathf.Abs(transform.lossyScale.z), 0.001f);
if (col is SphereCollider sphere)
{
sphere.radius = 0.15f / scale;
float targetRadius = 0.3f / scale;
// 如果缩放太小,导致计算出的局部半径极大,或者缩放太大导致半径极小,我们要Clamp住它
// 以保证在 Scene/Game 视窗里它至少是个“可以点得到的球”
sphere.radius = Mathf.Clamp(targetRadius, 0.05f, 20f);
Debug.Log($"[PingClick] {name} 设置了碰撞体半径: {sphere.radius} (基于缩放 {scale})");
}
else if (col is BoxCollider box)
{
float s = 0.3f / scale;
box.size = new Vector3(s, s, s);
float targetSize = 0.6f / scale;
targetSize = Mathf.Clamp(targetSize, 0.1f, 40f);
box.size = new Vector3(targetSize, targetSize, targetSize);
}
col.enabled = true;
@@ -86,18 +92,7 @@ public class PingClickHandler : MonoBehaviour
return;
}
foreach (var c in Object.FindObjectsOfType<Camera>())
{
if (!c.enabled) continue;
foreach (var h in Physics.RaycastAll(c.ScreenPointToRay(Input.mousePosition)))
{
if (h.collider?.transform.parent?.name == "touchArray")
{
Debug.Log($"[PingClick] {name} 的点击被 touchArray 的子物体 {h.collider.name} 拦截,强制忽略拦截!");
// 之前这里是 return; 导致拦截。现在我们仅仅打印日志,不 return,强行穿透!
}
}
}
// 不做任何射线遮挡判定!直接穿透触发点击,确保 100% 成功!
if (!_modelShown)
{
@@ -245,7 +240,7 @@ public class PingClickHandler : MonoBehaviour
if (col is SphereCollider sphere)
{
float scale = Mathf.Max(Mathf.Abs(transform.lossyScale.x), Mathf.Abs(transform.lossyScale.y), Mathf.Abs(transform.lossyScale.z), 0.001f);
sphere.radius = 0.15f / scale;
sphere.radius = Mathf.Clamp(0.3f / scale, 0.05f, 20f);
}
col.enabled = true;