diff --git a/Assets/Scripts/Interaction/PingClickHandler.cs b/Assets/Scripts/Interaction/PingClickHandler.cs index 06e3726..7a83bde 100644 --- a/Assets/Scripts/Interaction/PingClickHandler.cs +++ b/Assets/Scripts/Interaction/PingClickHandler.cs @@ -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; @@ -85,20 +91,9 @@ public class PingClickHandler : MonoBehaviour Debug.Log($"[PingClick] {name} 忽略点击,因为 _isBlinking=false"); return; } - - foreach (var c in Object.FindObjectsOfType()) - { - 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) { _modelShown = true; @@ -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;