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

Unity中如何从其他脚本获取Raycast射线检测命中结果

Unity跨脚本获取Raycast反射检测结果的简便实现

不用走图层过滤或者复杂的消息传递,直接用公共字段存检测结果跨脚本读就行,实现成本最低,逻辑也最可控。

具体实现步骤

  • 在脚本A中将射线检测的结果存为类级别的公共可访问字段,不要把碰撞信息只存在方法内的局部变量里(局部变量出了方法作用域外部就访问不到)。
    修改后的脚本A核心逻辑参考:
    // 存储当前帧射线的碰撞结果
    public RaycastHit currentHitInfo;
    // 直接存好是否命中镜面的判断结果,不用其他脚本重复做标签校验
    public bool isHitMirrorSurface;
    
    void Update()
    {
        // 原有射线发射逻辑
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hitInfo))
        {
            currentHitInfo = hitInfo;
            // 建议把原有的tag == "Mirror"写法换成CompareTag,性能更高,也能避免拼写标签名时的隐形报错
            isHitMirrorSurface = hitInfo.collider.gameObject.CompareTag("Mirror");
        }
        else
        {
            // 未命中时重置状态,避免其他脚本读到上一帧的旧结果
            isHitMirrorSurface = false;
            currentHitInfo = default;
        }
    }
    
  • 在脚本B中持有脚本A的引用,直接读取预存的检测结果即可,不需要重复发射射线做检测。
    脚本B核心逻辑参考:
    // 可以直接在Inspector面板把挂载了脚本A的物体拖到这个字段完成赋值,稳定性最高
    public ScriptA raycastHandler;
    
    void Update()
    {
        // 直接读取脚本A的检测结果做后续逻辑
        if (raycastHandler.isHitMirrorSurface)
        {
            // 需要碰撞细节直接取currentHitInfo里的值就行,比如碰撞点、法线、碰撞体引用
            Vector3 reflectionHitPoint = raycastHandler.currentHitInfo.point;
            Vector3 reflectionNormal = raycastHandler.currentHitInfo.normal;
            
            // 这里写你的反射光线后续逻辑
        }
    }
    

方案优势

  • 不需要额外调整图层配置,也不需要实现单例、全局事件广播这类重型逻辑,代码量极少
  • 射线检测全程只在脚本A中执行一次,不会因为多个脚本需要结果就重复发射射线产生额外性能开销
  • 所有检测逻辑收敛在脚本A中,后续如果要调整射线检测的规则(比如修改镜面判定条件、调整射线长度),只需要改脚本A的代码,不需要动其他调用方的逻辑

避坑提示:如果不想在Inspector手动拖赋值,也可以在脚本B的Awake生命周期里用FindObjectOfType<ScriptA>()获取脚本A的引用,但这种查找方式有额外性能消耗,也容易因为场景里存在多个脚本A实例拿错对象,优先用Inspector拖拽赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 20:36:22