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

使用IL2CPP构建时Unity Raycast无返回结果的问题求助

解决方案:IL2CPP真机射线检测无响应问题

以下是针对该问题的排查和修复方向:

1. 替换手动射线生成逻辑,改用Camera.ScreenPointToRay

你当前手动计算射线方向的方式,容易因屏幕转世界坐标的z值误差导致射线方向偏离,尤其IL2CPP编译下浮点数精度差异可能放大这个问题。建议直接用Unity内置方法生成射线,更精准可靠:

修改代码如下:

public void TouchPress(InputAction.CallbackContext context)
{
    Vector2 touchPosition = touchPositionAction.ReadValue<Vector2>();
    // 直接生成从相机指向触摸点的射线
    Ray ray = Camera.main.ScreenPointToRay(touchPosition);
    RaycastHit hit;

    if(Physics.Raycast(ray, out hit, 10f))
    {
        Debug.Log($"命中对象: {hit.collider.gameObject.name}");
        if(hit.collider.gameObject.layer == 6)
        {
            prop = hit.collider.gameObject;
            rb = prop.GetComponent<Rigidbody>();

            rb.useGravity = false;
            rb.velocity = Vector3.zero;
            rb.angularVelocity = Vector3.zero;

            // 改用射线命中点计算触摸偏移
            touchOffset = prop.transform.position - hit.point;

            holding = true;
        }
    }
}

2. 用LayerMask指定检测层,避免层索引不一致

直接用层索引数值(6)可能在真机构建时出现层配置不同步的情况,建议通过LayerMask变量指定目标层,确保跨环境一致:

// 在类中声明变量,然后在Inspector面板选择需要检测的层
public LayerMask targetLayer;

public void TouchPress(InputAction.CallbackContext context)
{
    Vector2 touchPosition = touchPositionAction.ReadValue<Vector2>();
    Ray ray = Camera.main.ScreenPointToRay(touchPosition);
    RaycastHit hit;

    // 射线检测时限定目标层
    if(Physics.Raycast(ray, out hit, 10f, targetLayer))
    {
        Debug.Log($"命中对象: {hit.collider.gameObject.name}");
        prop = hit.collider.gameObject;
        rb = prop.GetComponent<Rigidbody>();

        rb.useGravity = false;
        rb.velocity = Vector3.zero;
        rb.angularVelocity = Vector3.zero;

        touchOffset = prop.transform.position - hit.point;

        holding = true;
    }
}

3. 检查IL2CPP编译的代码裁剪设置

虽然关闭了"Strip engine code",但还需确认以下设置:

  • 打开Player Settings > Other Settings > Managed Stripping Level,设置为Disabled或Low,防止物理相关核心代码被裁剪
  • 给涉及物理交互的代码添加[UnityEngine.Scripting.Preserve]属性,避免AOT编译时被移除:
[UnityEngine.Scripting.Preserve]
public void TouchPress(InputAction.CallbackContext context)
{
    // 你的触摸处理代码
}

// 也可以直接给脚本类添加该属性
[UnityEngine.Scripting.Preserve]
public class YourTouchHandler : MonoBehaviour
{
    // 类内容
}

4. 验证触摸输入坐标的正确性

真机上的触摸坐标可能因屏幕适配、分辨率差异出现偏移,建议在代码中打印关键参数,确认输入是否正常:

Vector2 touchPosition = touchPositionAction.ReadValue<Vector2>();
Debug.Log($"触摸坐标: {touchPosition}, 相机分辨率: {Camera.main.pixelWidth}x{Camera.main.pixelHeight}");

内容的提问来源于stack exchange,提问作者Kirill Zakharenko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 17:33:01