UI准星内Raycast腰射散布计算异常问题排查与解决
UI准星Raycast对齐问题排查与解决
【更新】 我已解决该问题,因未投入全部精力,故耗时较久才找到方案。
我近日遇到一个问题:希望在UI准星范围内发射Raycast,但始终无法正常工作——更改屏幕宽高比或准星尺寸都会导致子弹射至准星外,仅在4K分辨率设置下,子弹几乎能命中准星中心。
处理Raycast的核心代码
//若滚动至本页面下方,可查看带注释的UIHandler方法实现 Vector3 origin = UIHandler.SINGLETON.gunCrosshair.GetCrosshairPosition(); float pixelDelta = UIHandler.SINGLETON.gunCrosshair.GetCrosshairPixelDelta(); float spread = pixelDelta / Screen.width * Camera.main.fieldOfView; /* hipfireSpreadMultiplier是必要值,因散布本身数值极小。 测试时仅向origin添加右侧方向偏移 */ origin += spread* Vector3.right * hipfireSpreadMultiplier; Ray ray = Camera.main.ScreenPointToRay(origin); if (Physics.Raycast(ray, out RaycastHit raycastHit, 900, enemyLayerMask)) Debug.Log("I did hit " + raycastHit.transform.name);
处理UI准星的核心代码
public void UpdateCrosshairSize(float size) { //移动时该方法会放大准星 crosshair.sizeDelta = Vector2.one * size * crosshairSizeMultiplier; } public float GetCrosshairInnerEdge() { //right为RectTransform,是准星的右侧白线 return right.position.x - right.sizeDelta.x / 2; } public Vector3 GetCrosshairPosition() { //crosshair为RectTransform,是准星所有线条的父物体 return crosshair.position; } public float GetCrosshairPixelDelta() { //计算准星中心与右侧准星线条起点的差值 return GetCrosshairInnerEdge() - GetCrosshairPosition().x; }
尽管代码逻辑看似合理,但子弹并不总能与准星对齐。以下是相机正对前方时的问题表现(枪械后坐力会导致准星上移,但散布计算仅使用准星偏移值):
- 第一发子弹与准星对齐
- 第二发子弹触及准星右侧线条
- 第三发子弹射至准星外
已尝试的排查方案
- 散布计算调整:
- 用CrosshairSize替代hipfireSpreadMultiplier进行乘法运算
- 移除Screen.width除数
- 使用原始散布而非基于准星计算的散布执行Raycast
内容的提问来源于stack exchange,提问作者Patrick Moling
相关产品推荐
相关产品推荐

